PHP: INPUT_POST (используется в filter_input_array) перезаписывает все предыдущие модификации $_POST

параметр INPUT_POST функции фильтра PHP filter_input_array(), например. в

filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

кажется, перезаписывает любые изменения, примененные к суперглобальному $_POST.

тестовое задание:

<?php
// 1.
$_POST['abc'] = '123';
var_dump($_POST);

// 2.
$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
var_dump($_POST);
?>

выход:

после // 2. ваш $_POST будет пустым (поскольку исходный POST был пустым)

index.php:4:
array (size=1)
'abc' => string '123' (length=3)

index.php:8:null

так что обязательно поставь

$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING, true);

в верхней части ваших скриптов!

В: кто-нибудь еще замечал такое поведение или я ошибся в рассуждениях?

Возможный ответ: данные берутся из суперглобального $_REQUEST, а не из $_POST.


person Robert TheSim    schedule 17.08.2017    source источник
comment
Нигде не сказано, что это имеет какую-либо связь с $_POST.   -  person CBroe    schedule 17.08.2017
comment
@CBroe Единственная страница, на которой я вижу попытки определить INPUT_POST, — это этот список констант, который просто ссылается на страницу с описанием $_POST, так что предполагает связь со мной.   -  person IMSoP    schedule 17.08.2017
comment
@IMSoP почти уверен, что на самом деле его нет. В описании filter_input_vars сказано: «Получает внешние переменные и при необходимости фильтрует их» — и для меня это просто означает, что он получает данные из того же источника, который используется для заполнения $ _POST изначально. Манипулирование $_POST не изменяет данные, которые были отправлены изначально. Если вы проверите это с помощью скрипта, который получает фактические данные POST извне, и добавите дополнительную запись в $_POST, как показано выше, то вы увидите только исходные данные в отфильтрованном результате, а не те, которые добавлены только в $ _СООБЩЕНИЕ.   -  person CBroe    schedule 17.08.2017
comment
@CBroe Если вы можете это подтвердить, то это ответ. Это также то, что следует уточнить в документации, потому что, как я уже сказал, это неправда, что нигде не делается такая связь, список констант очень четко устанавливает такую ​​связь.   -  person IMSoP    schedule 17.08.2017
comment
INPUT_POST меня раздражал, см. мой -› Возможный ответ: в конце исходной статьи.   -  person Robert TheSim    schedule 17.08.2017


Ответы (2)


Прямой связи между $_POST и INPUT_POST нет.

Последнее указывает только на то, что filter_input_vars должен получать данные для фильтрации из того же источника, который изначально использовался для заполнения $_POST. Последующие манипуляции с $_POST не меняют того, какие данные POST изначально были отправлены сценарию.

Вы можете легко убедиться в этом, настроив небольшую форму, которая отправляет скрытое поле ввода в ваш скрипт. Затем добавьте дополнительную запись в $_POST в этом сценарии, как вы сделали в своем примере выше. Вы увидите, что filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING) возвращает массив, содержащий запись для скрытого поля, но не запись, которую вы добавили в $_POST вручную.

Этот http://php.net/manual/en/filter.constants.php описывает INPUT_POST как «переменные POST», и ссылки на описание $_POST могут немного вводить в заблуждение. Но, честно говоря, здесь написано POST, а не $_POST.

поэтому обязательно поместите $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING, true); в начало ваших скриптов!

Я бы не рекомендовал это. Каждый PHP-разработчик предполагает, что $_POST содержит нефильтрованные данные. Как только вы f.e. начните использовать сторонние модули, это может привести к проблемам.

Оставить $_POST как есть и использовать отдельную переменную для хранения отфильтрованных параметров POST — лучший способ, ИМХО.

person CBroe    schedule 17.08.2017

Ваша переменная $_POST содержит null после того, как эта функция будет выполнена и назначена $_POST. Из Руководства по PHP может быть возвращено null, поскольку ресурс над которым должна работать функция, не определено.

Я считаю, что вы должны исследовать либо целостность ваших переменных, либо использование вами этой функции.

person ksjohn    schedule 17.08.2017
comment
можно воспроизвести с помощью простого сценария формы, который отправляет запрос POST на сервер. В этом случае $_POST, а также ?$_REQUEST пусты. - person Robert TheSim; 17.08.2017