Попередження "Не отримуйте доступу до суперглобального масиву $ _POST безпосередньо" на Netbeans 7.4 для PHP


118

Я отримую це повідомлення попередження на Netbeans 7.4 для PHP, коли я використовую $ _POST , $ _GET , $ _SERVER , ....

Не отримуйте доступу до Суперглобального масиву $ _POST безпосередньо

Що це означає? Що я можу зробити, щоб виправити це попередження?

Редагувати: зразок коду події все ще містить це попередження.


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


6
Ви відповідаєте на запитання "що означає попередження" або на запитання "як його зняти"? Оскільки я згоден з вами, це означає попередження, але за допомогою функції попередження залишається там. У мене це зараз на $name = filter_input(INPUT_POST, $_POST["name"]);.
stenci

6
@stenci ви знову використовуєте $ _POST, тоді як ви повинні робити щось на зразок цього $ name = filter_input (INPUT_POST, "ім'я");
Войцех Собчик

16
Ну, попередження може зникнути, але якщо ви не вкажете фільтр, ви не справді вирішите проблему безпеки, на яку вказує NetBeans. Наприклад, якщо ви очікуєте int, використовуйте:filter_input(INPUT_POST, 'var_name', FILTER_SANITIZE_NUMBER_INT)
HoffZ

44
-1: Ця відповідь здається дещо тривіальною. немає пояснення, що робить filter_input, навіть немає посилання на php.net/filter_input . Мене лякає, що люди просто побачать це, використовуватимуть, подумають, що вони пишуть кращий код, але все ще нічого не розуміють.
IARI

5
Ow, що пропонує використання функції фільтра без аргументу фільтра призводить до 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 та doc:

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).
користувач3640967

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);

Примітка: застосувати до всіх інших змінних Super Global


0

Ось частина рядка в моєму коді, яка підняла попередження в NetBeans:

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

Провівши багато досліджень і побачивши, як існує близько мільйона способів фільтрації цього масиву, я знайшов той, який був простим. І мій код працює, і NetBeans задоволений:

$p = filter_input(INPUT_GET, 'p');
$page = (!empty($p))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.