Предупреждение «Не обращайтесь напрямую к суперглобальному массиву $ _POST» в Netbeans 7.4 для PHP

118

У меня есть это предупреждение в Netbeans 7.4 для PHP, когда я использую $ _POST , $ _GET , $ _SERVER , ....

Не обращаться напрямую к суперглобальному массиву $ _POST

Что это означает? Что я могу сделать, чтобы исправить это предупреждение?

Изменить: пример кода события по-прежнему показывает это предупреждение.

Kannika
источник
1
Какой код защищает это сообщение в Netbeans?
TiMESPLiNTER
2
Это просто рекомендация, вы можете отключить ее в настройках ... и я бы сказал, что это не вопрос программирования!
Маттео Тассинари
1
Я просто хочу знать, что это предупреждение хочет, чтобы я изменил! потому что более старая версия netbeans не отображается. Есть ли другой способ получить эти параметры? (Я имею в виду $ _POST)
Канника
@MatteoTassinari Я знаю, что это всего лишь рекомендация, и я знаю, где ее отключить, но что я могу сделать, чтобы исправить это без предупреждения? Я думаю, что мои знания имеют предел для получения предупреждений, но я просто хочу исправить это, чтобы обновить мой код, потому что я знаю, что только $ _POST получит эту форму для публикации. В любом случае, спасибо за ваш комментарий: D
Kannika

Ответы:

92

filter_input(INPUT_POST, 'var_name')вместо $_POST['var_name']
filter_input_array(INPUT_POST)вместо$_POST

Homerocker
источник
6
Вы отвечаете на вопрос «что означает предупреждение» или на вопрос «как его удалить»? Поскольку я согласен с вами, предупреждение означает именно это, но при использовании функции предупреждение остается на месте. Он у меня сейчас на с $name = filter_input(INPUT_POST, $_POST["name"]);.
stenci
6
@stenci, вы снова используете $ _POST, а вам нужно сделать что-то вроде этого $ name = filter_input (INPUT_POST, "name");
Войцех Собчик
16
Что ж, предупреждение может исчезнуть, но если вы не укажете фильтр, вы действительно не решите проблему безопасности, на которую указывает NetBeans. Например, если вы ожидаете int, используйте:filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
HoffZ
44
-1: Этот ответ кажется тривиальным. нет объяснения, что делает filter_input, даже нет ссылки на php.net/filter_input . Меня пугает, что люди просто увидят это, воспользуются им, подумают, что они пишут лучший код, но все равно ничего не поймут.
IARI
5
Ой, предложение использовать функцию фильтра без аргумента фильтра приводит к FILTER_UNSAFE_RAW, что эквивалентно TRUST_ALL_BAD_INPUT
Kzqai
88

Хотя немного поздно, я столкнулся с этим вопросом при поиске решения той же проблемы, поэтому я надеюсь, что это может помочь ...

Оказался в той же тьме, что и ты. Только что нашел эту статью, в которой объясняются некоторые новые подсказки, представленные в NetBeans 7.4, в том числе этот:

https://blogs.oracle.com/netbeansphp/entry/improve_your_code_with_new

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

Например, где у меня было:

$_SERVER['SERVER_NAME']

Вместо этого я поставил:

filter_input(INPUT_SERVER, 'SERVER_NAME', FILTER_SANITIZE_STRING)

У вас есть документ filter_input и Filters здесь:

http://www.php.net/manual/en/function.filter-input.php

http://www.php.net/manual/en/filter.filters.php

Рикардо Паломарес Мартинес
источник
Если вы сделаете именно то, что говорите, Netbeans все равно подчеркнет части «$ _POST» или «$ _GET» и отобразит уведомление, как если бы оно не фильтровалось. Эта проблема может быть просто ошибкой Netbeans (по крайней мере, в версии 8.1).
user3640967 05
6

Я согласен с другими ответчиками, что в большинстве случаев (почти всегда) необходимо дезинфицировать Ваш ввод.

Но рассмотрим такой код (он для REST-контроллера):

$method = $_SERVER['REQUEST_METHOD'];

switch ($method) {
            case 'GET':
                return $this->doGet($request, $object);
            case 'POST':
                return $this->doPost($request, $object);
            case 'PUT':
                return $this->doPut($request, $object);
            case 'DELETE':
                return $this->doDelete($request, $object);
            default:
                return $this->onBadRequest();
}

Применять здесь дезинфекцию было бы не очень полезно (хотя это тоже ничего не сломало бы).

Так что следуйте рекомендациям, но не вслепую - лучше разбирайтесь, зачем они нужны :)

Рауни Лиллеметс
источник
1

Просто используйте

filter_input (INPUT_METHOD_NAME, 'var_name') вместо $ _INPUT_METHOD_NAME ['var_name'] filter_input_array (INPUT_METHOD_NAME) вместо $ _INPUT_METHOD_NAME

например

    $host= filter_input(INPUT_SERVER, 'HTTP_HOST');
    echo $host;

вместо того

    $host= $_SERVER['HTTP_HOST'];
    echo $host;

И использовать

    var_dump(filter_input_array(INPUT_SERVER));

вместо того

    var_dump($_SERVER);

NB: применимо ко всем остальным суперглобальным переменным.

Сани Камаль
источник
0

Вот часть строки в моем коде, которая вызвала предупреждение в NetBeans:

$page = (!empty($_GET['p'])) 

После долгих исследований и наблюдения за миллионом способов фильтрации этого массива я нашел простой. И мой код работает, и NetBeans доволен:

$p = filter_input(INPUT_GET, 'p');
$page = (!empty($p))
Джим Типпинс
источник