Когда filter_input () удаляет косые черты переменных POST? - PullRequest
2 голосов
/ 02 марта 2012

Я создал небольшой PHP-скрипт, который запускается на сервере с PHP 5.2.17 и включенной директивой magic_quotes_gpc.

У меня нет прав на запись в файл php.ini, и я хотел бы удалить все слэши из пользовательского ввода.

Это должно работать, даже если директива magic_quotes_gpc отключена (например, при перемещении сценариев на другой сервер).

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

<code><html>
<head>
    <title>HP</title>
</head>
<body>

<form method="POST" action="magic.php">
<input type="text" value="te\\&quot;st" name="test1">
<input type="text" value="te\\&quot;st" name="test2[tw&quot;o]">
<input type="submit" value="submit">
</form>
<?php

echo "<pre>";
echo "magic_quotes: ".get_magic_quotes_gpc()."\n";
echo "<hr>test1";
echo "filter_input: ".filter_input(INPUT_POST, "test1")."\n";
echo "POST:         ".$_POST['test1']."\n";

echo "<hr>test2 (filter)";
print_r(filter_input_array(INPUT_POST))."\n";

echo "<hr>test2 (post)";
print_r($_POST)."\n";

echo "
"; ?>

Что дает следующий результат на моем сервере:

magic_quotes: 1

filter_input: te\\"st
POST:         te\\\\\"st

test2 (filter)Array
(
    [test1] => te\\"st
    [test2] => Array
        (
            [tw\"o] => te\\"st
        )

)

test2 (post)Array
(
    [test1] => te\\\\\"st
    [test2] => Array
        (
            [tw\"o] => te\\\\\"st
        )

)

Похоже, что кроме ключей массива косые черты удалены.

Или косые черты никогда не добавляются? (filter_input() и filter_input_array() могут игнорировать директиву magic_quotes_gpc, поскольку она устарела; но я не смог найти ссылку для этого)

Зависит ли поведение удаления / отсутствия установки слешей filter_input() и filter_input_array() от системных параметров?
Я не понимаю предупреждение здесь .

Ответы [ 2 ]

3 голосов
/ 23 июля 2014

Мне не удалось найти его в официальной документации, но функция filter_input() работает с необработанными данными и не зависит от настроек magic_quotes. Фильтр очистки, FILTER_SANITIZE_MAGIC_QUOTES, вставит их, если они вам понадобятся.

Лично для меня это было благом, потому что я работаю в устаревшей системе с включенным magic_quotes. Используя функцию filter_input(), я могу использовать значения без необходимости убирать косые черты перед их связыванием в PDO.

Эти статьи говорят об этом:
http://www.sitepoint.com/forums/showthread.php?590848-Filter_input-magic-quotes
https://weston.ruter.net/2013/10/22/revelations-about-filter_input/
http://php.net/manual/en/function.filter-input.php#99124

0 голосов
/ 02 марта 2012

Я обычно использую что-то в следующих строках для нормализации входных данных по отношению к настройке magic_quotes.

function deslash (array $data)
{
    foreach ($data as $key => $val)
    {
        $data [$key] = is_array ($val)? deslash ($val): stripslashes ($val);
    }
    return $data;
}

if ((!empty ($_POST)) && (get_magic_quotes_gpc ()))
{
    $posted = deslash ($_POST);
}
...