У меня есть массив, который исходит от $_POST[]
и может иметь в нем другие массивы как значения, например:
array( 'title' => 'Title', 'data' => array( 'hdr' => 'Header' 'bdy' => 'Body' ), 'foo' => array(1, 23, 65), ... )
Как я могу дезинфицировать все значения этого большого массива? например. примените strip_tags()
к значениям, таким как Title , Header , Body , 1 , 23 , 65 и т. д.?
Посмотрите на 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
Просто используйте расширение фильтра .
/* prevent XSS. */ $_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING); $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
Это будет дезинфицировать ваши $_GET
и $_POST
.
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);
Предположим, мы хотим дезинфицировать массив $ _POST:
foreach($_POST as $k=>$v) {$_POST[$k] = htmlspecialchars($v);}
Это просто. Не так ли?