PHP: Как массово заменить $ _POST [...] на strip_tags ($ _ POST [...]) - PullRequest
5 голосов
/ 25 августа 2010

В настоящее время я оправляюсь от неприятной атаки XSS и понял, что никогда не очищал входные данные от нескольких форм на моем сайте.Я использовал функцию «Поиск в файлах» в Notepad ++ для поиска $_POST во всех моих PHP-файлах и получил почти 5000 результатов.Теперь я действительно не хочу идти и вручную добавлять strip_tags к каждому из этих результатов, но замена-все бы не сработала ... и я совершенно нубрегулярные выражения.

Есть ли способ сделать это немного менее утомительным?

Ответы [ 5 ]

18 голосов
/ 25 августа 2010

Просто используйте array_map().

$Clean = array_map('strip_tags', $_POST);

Или, если хотите, чтобы оно вернулось к переменной $_POST:

$_POST = array_map('strip_tags', $_POST);

Это, вероятно,Однако лучше использовать другую переменную и изменить в своих файлах все вхождения от $_POST до $Clean.

7 голосов
/ 25 августа 2010

Хм, я думаю array_walk_recursive сделают трюк:

function custom_strip(&$val, $index) {
   $val = strip_tags($val);
}
array_walk_recursive($_POST, 'custom_strip');
2 голосов
/ 25 августа 2010

вы можете поместить это в файл (например, safe.php)

foreach ($_POST as $key => $value) {
  $_POST[$key] = is_array($key) ? $_POST[$key]: strip_tags($_POST[$key]);
}

Затем поместите require_once("safe.php"); в каждый из ваших php-файлов (или в файл, который уже включен в ваш php-файл)
Это ужасный хак ... но это может сэкономить ваше время.

0 голосов
/ 25 августа 2010

Вы можете просто array_map strip_tags до $_POST, но гораздо приятнее написать пользовательскую функцию для получения данных из нее:

function post_data($name) {
    global $post_cache;
    if (in_array($name, $post_cache)) {
        return $post_cache[$name];
    }
    $val = $_POST[$name];
    if (is_string($val)) {
        $val = strip_tags($val);
    } else if (is_array($val)) {
        $val = array_map('strip_tags', $val);
    }
    $post_cache[$name] = $val;
    return $val;
}

Это сделает ваш код более читабельным (другие, изучающие его, обычно считают, что $_POST['foo'] - это данные в поле формы foo, а не то, что вы уже предварительно обработали), не вызовут проблем с плагинами или библиотеками. который пытается получить прямой доступ к $ _POST, облегчает добавление дополнительной логики к $_POST предварительной обработке (unescape, когда включены магические кавычки - обычное явление) без поиска всех мест в вашем коде, где у вас есть использовать данные POST и избавляет вас от огромных головных болей, когда вы понимаете, что есть несколько полей POST, где вам нужны HTML-теги. Как правило, это действительно плохая идея - напрямую изменить любой из суперглобальных элементов.

Кроме того, лучше очищать данные на выходе, а не на входе. Для разных целей потребуются разные методы, например, если вы используете

<div class="user_photo">
   <img src="<?php echo photo_path($user_id) ?>" alt="<?php echo $user_name ?>" />
</div>

затем $user_name является вектором атаки XSS, и strip_tags не помогает против него вообще; вам нужно будет htmlspecialchars . Если в качестве URL-адреса используются пользовательские данные, вам потребуется еще один метод защиты от javascript: URL-адресов и т. Д.

0 голосов
/ 25 августа 2010

Очень просто.Поместите это поверх каждого вашего файла ИЛИ в общий заголовочный файл, который каждый раз вызывается в самом начале:

function mystriptag(&$item)
{
    $item = strip_tags($item);
}

array_walk($_POST, mystriptag);
...