PHP-дезинфицировать значения массива

У меня есть массив, который исходит из $_POST[] и может содержать другие массивы в качестве значений, например:

array(
 'title' => 'Title',
 'data' => array(
             'hdr' => 'Header'
             'bdy' => 'Body'
           ),
  'foo' => array(1, 23, 65),
  ...
)

Как я могу очистить все значения этого большого массива? для например. примените strip_tags() к таким значениям, как Title, Header, Body, 1, 23 , 65 и т. д. ?


person Alex    schedule 01.02.2011    source источник
comment
Я надеюсь, что вы не будете использовать эту идею очистки для экранирования SQL.   -  person Your Common Sense    schedule 01.02.2011
comment
нет, это делается перед вставкой в ​​SQL   -  person Alex    schedule 01.02.2011


Ответы (5)


Взгляните на array_map.

<?php  
$a = array(
'title' => 'Title',
'data' => array(
    'hdr' => 'Header',
    'bdy' => 'Body'
    ),
'foo' => array(1, 23, 65)
);

$b = array_map("strip_tags", $a);
print_r($b);
?>

Обновление для 2D-массива:

function array_map_r( $func, $arr )
{
    $newArr = array();

    foreach( $arr as $key => $value )
    {
        $newArr[ $key ] = ( is_array( $value ) ? array_map_r( $func, $value ) : ( is_array($func) ? call_user_func_array($func, $value) : $func( $value ) ) );
    }

    return $newArr;
}

Применение:

$a = array(
'title' => 'Title',
'data' => array(
    'hdr' => 'Header',
    'bdy' => 'Body'
    ),
'foo' => array(1, 23, 65)
); 

$ar =array_map_r('strip_tags', $a);
print_r($ar);

Обратите внимание, что я нашел это, просто выполнив поиск комментариев для Dimension.

person kieran    schedule 01.02.2011
comment
Но я получаю Warning: strip_tags() expects parameter 1 to be string, array given. Я думаю, что это не работает для массивов 2-го уровня +... - person Alex; 01.02.2011
comment
@полковник Shrapnel: на самом деле, согласно php.net array_walk_recursive() - Any key that holds an array will not be passed to the function. я просто тестировал поведение array_walk_recursive(), и оно сильно отличается от решения выше, плюс array_walk_recursive() тоже кажется глючным. - person Zubair1; 26.04.2011

Просто используйте расширение фильтра.

/* prevent XSS. */
$_GET   = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

Это продезинфицирует ваши $_GET и $_POST.

person Alfred    schedule 01.02.2011

function strip($string, $allowed_tags = NULL)
{
    if (is_array($string))
    {
        foreach ($string as $k => $v)
        {
            $string[$k] = strip($v, $allowed_tags);
        }
        return $string;
    }

    return strip_tags($string, $allowed_tags);
}

Просто пример рекурсивной функции для удаления тегов в данном случае.

$arr = strip($arr);
person Kemo    schedule 01.02.2011

Это выглядит нормально, но, пожалуйста, прокомментируйте, если это можно улучшить или есть какие-либо опасения:

$_GET =filter_var_array($_GET);
$_POST=filter_var_array($_POST);
person Paris Z    schedule 18.04.2020

Допустим, мы хотим очистить массив $_POST:

foreach($_POST as $k=>$v) {$_POST[$k] = htmlspecialchars($v);}

Это просто. Не так ли?

person Marc Tremblay    schedule 01.10.2012
comment
1) это не будет работать рекурсивно, ключевой момент в вопросе. 2) никогда не очищать значения на входе. Всегда очищайте их на конце выходных данных, так как это выходные данные (будь то html, база данных, xml, json и т. д.), которые определяют требования. Приведенный выше код подвергается серьезному риску, например, оставить его открытым для атак SQL Injection. - person Will Palmer; 01.10.2012
comment
Вопрос был не в том, чтобы дезинфицировать SQL-инъекции. Пришлось снимать бирки. Я думаю, что для этой цели лучше использовать Prepared Statement. Код, который я написал, не удаляет теги, он просто переписывает эти специальные символы html в отображаемый формат формат, пример: é. Конечно, вы можете заменить htmlspecialchars на strip_tags. Зависит от того, что вы хотите сделать! - person Marc Tremblay; 01.10.2012
comment
Подготовленные операторы действительно защищают от SQL-инъекций, но они также являются формой очистки на выходе, а не на входе. Никогда не очищайте входные данные и уж точно никогда не выполняйте и то, и другое :). Намеченная цель состоит в том, чтобы сделать вещи разумными для вывода в HTML, а не ломать их для любой другой потенциальной цели. Вот как выглядел бы magic_quotes_gpc этот код, если бы люди больше заботились об атаках XSS, чем о SQL-инъекциях. Это плохо. Не делай этого. Не делайте ничего подобного. - person Will Palmer; 01.10.2012