2012-03-02 2 views
2

Я создал небольшой PHP-скрипт, который запускается на сервере с PHP 5.2.17 и директивой magic_quotes_gpc.Когда filter_input() удаляет следы переменных POST?

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

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

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

<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 "</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() каких-то образом зависят от системы-параметров?
Я не понимаю предупреждения here.

ответ

0

Обычно я использую что-то по следующим строкам для нормализации входных данных против установки 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); 
} 
+0

Я использую подобную вещь в данный момент, но если filter_input() и filter_input_array() делать то, что мне нужно, я бы предпочел не записывая для этого дополнительную рекурсивную функцию. Но я понятия не имею, почему filter_input делает то, что он делает. Это было бы здорово узнать. –

3

Я была неудачной в поиске его в официальной документации, но функция 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