2013-08-02 2 views
4

Мне интересно, можно ли получить переменную, находится ли она в POST или GET, а затем использовать filter_input() для ее дезинфекции.Как проверить как данные POST, так и GET при использовании filter_input?

Сначала я думал, что $var = filter_input(INPUT_POST | INPUT_GET, "var", FILTER_SANITIZE_STRING) может работать, однако это не так, и в руководстве по PHP указано, что вы можете передавать только один тип ввода.

Я также пробовал INPUT_REQUEST, что странно не сработало. Функция распознает его (т. Е. Не вызывает ошибку, говоря, что я поставил что-то неправильно в $ input), но он не получит никакого кода. И да, я знаю, что не должен использовать INPUT_REQUEST в живой среде, я просто просто тестировал, будет ли это работать.

В настоящее время я делаю следующее:

$var = filter_input(INPUT_POST, "var", FILTER_SANITIZE_STRING); 
if(!$var) $var = filter_input(INPUT_GET, "var", FILTER_SANITIZE_STRING); 

однако со многими вещами в PHP, часто более простой способ, который будет делать все это для меня в одной команде. Мне интересно, если это так, я могу объединить их в одну проверку? Я выполнил беглый поиск в Google и даже не нашел ссылок на тех, кто пытался это сделать раньше, не говоря уже о решении, поэтому теперь я обращаюсь к вам с хорошими людьми.

+0

С какой целью вы хотите «дезинфицировать» вашу строку? –

+0

Чтобы убедиться, что никакой вредоносный код не был введен в переменную GET, или в случае POST кто-то не изменил форму (скорее всего, это была скрытая переменная) и разместил там что-то злонамеренное. – Styphon

+0

http://php.net/manual/en/function.filter-input.php - как сказано, первый параметр является одной из констант, без массива, no || пункт. Если вы хотите сделать это с одной строкой, вы должны сделать пользовательскую функцию, которая принимает массив, то есть, задает и устанавливает все элементы в качестве первого параметра.Тем не менее, это кажется плохой практикой, поскольку вы действительно не знаете, что такое ваш вход. –

ответ

3

Это считается плохой практикой, если вы не знаете, находится ли ваш вход в GET или POST. Вы всегда должны знать, а не просто произвольно принимать что угодно.

+0

В основном я согласен с этим, и обычно я придерживаюсь к одному или другому. Иногда я возникаю в ситуации, когда я отправляю данные на страницу из формы, но также, как и пользователь, чтобы иметь возможность сохранить ссылку с доступной переменной, проще использовать как типы POST, так и GET. – Styphon

+0

Итак, вы говорите: «Я знаю, что мой прецедент плох, но мне все равно нравится его поддерживать». – Halcyon

+5

Ни в коем случае, я утверждаю, что в большинстве случаев это плохая практика, хотя, как и в большинстве случаев, есть исключения из правила. – Styphon

0

Из того, что я прочитал, вы можете изменить значение POST в вашей форме на GET - таким образом вам нужно принять только GET - не уверен, что я понял это правильно.

1

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

function getPostOrGet($name) { 

    $var = filter_input(INPUT_POST, $name, FILTER_SANITIZE_STRING); 

    if(!$var) $var = filter_input(INPUT_GET, $name, FILTER_SANITIZE_STRING); 

    return $var; 

} 

И если вы думаете, в нем нормально, вы не можете использовать оператор |, потому что тогда что произошло, если оно определено в обоих.

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

0

Если вы дезинфицировать правильно ваш вклад, я бы лично проверить результат filtre_input для null, так как условие if(!$var) может быть вызвано falsy, но существующее значение как 0.

Например:

function getLatitude($name) { 
    $var = filter_input(INPUT_POST, 'latitude', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); 
    if($var === null){ 
     $var = filter_input(INPUT_GET, 'latitude', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); 
    } 
    return $var; 
} 

С обычным !$var состоянии и FILTER_SANITIZE_NUMBER_FLOAT, вы получите null значение вместо 0.