5

I'm currently recovering from a nasty XSS attack, and realized I never sanitized inputs on several of the forms on my site. I used Notepad++'s Find In Files feature to search for $_POST in all my PHP files, and got almost 5,000 results. Now, I really don't want to go and manually add strip_tags to every one of those results, but a replace-all wouldn't do the trick... and I'm a total noob when it comes to things like regular expressions.

Is there any way to make this a little less tedious?

4

5 に答える 5

18

を使用するだけarray_map()です。

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

$_POSTまたは、変数に戻したい場合は、次のようにします。

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

$_POST別の変数を使用して、ファイル内のすべての出現箇所をに変更することをお勧め$Cleanします。

于 2010-08-25T04:59:55.810 に答える
7

うーん、私array_walk_recursiveはトリックを行うと思います:

function custom_strip(&$val, $index) {
   $val = strip_tags($val);
}
array_walk_recursive($_POST, 'custom_strip');
于 2010-08-25T04:46:54.577 に答える
2

これをファイルに入れることができます(例:safe.php)

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

次にrequire_once("safe.php");、すべての php ファイル (またはすべての php ファイルが既に含まれているファイル) を入れ
ます。これは醜いハックですが、時間を節約できます。

于 2010-08-25T04:45:24.563 に答える
0

することもできますが、そこからデータを取得するためのカスタム関数を作成する方がはるかに優れています。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データを使用したコード内のすべての場所を探し出すことなく、前処理にロジックを簡単に追加できます(マジッククォート$_POSTが有効になっている場合のエスケープは一般的なものです)。 HTML タグが必要なフィールド。一般に、スーパーグローバルを直接変更することは非常に悪い考えです。

また、入力ではなく出力でデータをサニタイズすることをお勧めします。用途が異なれば、必要な方法も異なります。たとえば、

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

then$user_nameは XSS 攻撃ベクトルであり、strip_tagsそれに対してはまったく役に立ちません。htmlspecialcharsが必要です。ユーザー データが URL として使用される場合は、URL などを防御するためのさらに別の方法が必要になりjavascript:ます。

于 2010-08-25T05:48:23.663 に答える
0

とてもシンプルです。これをすべてのファイルの上に置くか、毎回最初に呼び出される共通ヘッダー ファイルに置きます。

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

array_walk($_POST, mystriptag);
于 2010-08-25T04:51:13.563 に答える