Помогите разобраться с тем как обращаться к $_GET

Вобщем есть простой код...

if(isset($_GET['link']){}

Когда я обращаюсь к $_GET мой NetBeans пишет мне, что я не должен обращаться к суперглобальному массиву напрямую. Покурил форумы, повтыкал на примеры, но все примеры написанные в интернете так и используют. Вопрос в том - как делать то?

И попутно хочу спросить. Если я проверяю с помощью isset есть ли такой-то GET, то безопасно ли это? Я имею ввиду, чтобы нельзя было засунуть в $GET['link'] что-то плохое, что может прервать выполнение моего кода.


Ответы (2 шт):

Автор решения: Keith Naumov

GET POST одно и тоже но GET отображается в адресе сайта, у меня была форма, <input type='text' name="login">

Я с нее проверял через пост,

if ($_POST['login']){ Действие }

→ Ссылка
Автор решения: Егор Банин

Суперглобальные массивы таят в себе опасность. Возможность обратится к ним из любого места приводит к злоупотреблению и ситуациям типа:

<?php // foo.php

$x = $_GET['x']?? '';
// ...

function foo() {
    $x = $_GET['x']?? '';
    // ...
}
// ...

include 'bar.php';
<?php // bar.php

$x = $_GET['x']?? '';
// ...

Теперь, если надо поменять название параметра x на y, то придётся искать по всему коду $_GET['x'] и переименовывать. Представьте, что будет если где-то вы всё-таки забудете поменять этот x на y.

Вероятно использование функции filter_input успокоит нетбинс. Но обратите внимание, что этой функцией можно злоупотребить так же как суперглобальными массивами.

Ответственный разработчик строго определяет место, в котором он обращается к суперглобальным массивам. Часто это происходит только в одном месте -- при вызове конструктора объекта HttpRequest (например в симфони). Но если у вас просто набор скриптов, то соглашения использовать обращения к суперглобальным массивам только в точках входа, в начале файла может быть достаточно.

Конструкция if (isset($_GET['foo'])) {/* сделать что-то кроме присвоения значения переменной */} плохая по той причине, что может возникнуть необходимость повторять её снова. Допустим надо вывести сообщение:

<?php

echo 'Вам письмо';
if (isset($_GET['from'])) {
    echo ' от ' . htmlspecialchars($_GET['from']);
}

echo "\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua\n\n";

if (isset($_GET['from'])) {
    echo 'С наилучшими пожеланиями. Ваш ' . htmlspecialchars($_GET['from']) . "\n\n";
}

Получается мы обращаемся к $_GET четыре раза в разных местах! Так не годится. Правильнее будет получить значение один раз в начале скрипта и больше не трогать $_GET['from']:

<?php

$from = $_GET['from']?? '';

echo 'Вам письмо';
if ($from) {
    echo ' от ' . htmlspecialchars($from);
}

echo "\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua\n\n";

if ($from) {
    echo 'С наилучшими пожеланиями. Ваш ' . htmlspecialchars($from) . "\n\n";
}

Так гораздо лучше:

  • Вы можете легко изменить название параметра from при необходимости;
  • Если вы допустили ошибку при присвоении $from (например написали в слове 'frоm' русскую о), то обнаружить её гораздо проще;
  • Если вы захотите найти все использования $from, то ваша IDE вам сможет помочь.

Нетбинс всё ещё может ругаться на прямое обращение к $_GET. Если вас это беспокоит, замените его на filter_input.


Про безопасность. Само по себе присвоение $foo = $_GET['foo']?? ''; безопасно. Но помните, что в $foo могут быть любые данные. Нельзя вставлять их в HTML, SQL, regex, sh и любой другой специальный формат без соответствующей обработки.

→ Ссылка