Я создал небольшой PHP-скрипт, который работает на сервере с PHP 5.2.17 и директивой magic_quotes_gpc
.
У меня нет доступа для записи в файл php.ini, и я хочу удалить все слэши с пользовательских входов.
Это должно работать, даже если директива magic_quotes_gpc
отключена (например, при перемещении сценариев на другой сервер).
Он также должен работать рекурсивно, когда массивы передаются пользователем.
Я предпочитаю использовать встроенную функцию.
<html> <head> <title>HP</title> </head> <body> <form method="POST" action="magic.php"> <input type="text" value="te\\"st" name="test1"> <input type="text" value="te\\"st" name="test2[tw"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 "</pre>"; ?> </body> </html>
Это дает следующий результат на моем сервере:
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()
каким-то образом зависящим от системных параметров?
Я не понимаю этого предупреждения.
Мне не удалось найти его в официальной документации, но filter_input()
работает с необработанными данными и не зависит от настроек magic_quotes
. Фильтр очистки, FILTER_SANITIZE_MAGIC_QUOTES
, поместит их, если они вам понадобятся.
Это было благом для меня лично, потому что я работаю в старой системе с magic_quotes
. Используя filter_input()
я могу использовать значения без необходимости 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
Обычно я использую что-то в следующих строках для нормализации входных данных против установки 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); }