PHP:如何使用strip_tags($ _ POST [...])批量替换$ _POST [...]

时间:2010-08-25 04:35:26

标签: php forms input sanitize strip-tags

我正在从令人讨厌的XSS攻击中恢复,并意识到我从未对我网站上的几个表单上的输入进行清理。我使用Notepad ++的Find In Files功能在我的所有PHP文件中搜索$_POST,并获得了近5,000个结果。现在,我真的不想去为这些结果中的每一个手动添加strip_tags,但是替换所有人都不会做到这一点......而且当谈到像正则表达式这样的东西。

有没有什么方法可以减少这种繁琐?

5 个答案:

答案 0 :(得分:18)

只需使用array_map()

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

或者如果您希望它返回$_POST变量:

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

虽然使用不同的变量并将文件中$_POST的所有出现更改为$Clean,但这可能更好。

答案 1 :(得分:7)

嗯,我认为array_walk_recursive可以解决问题:

function custom_strip(&$val, $index) {
   $val = strip_tags($val);
}
array_walk_recursive($_POST, 'custom_strip');

答案 2 :(得分:2)

你可以将它放在一个文件中(例如safe.php)

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

然后在每个php文件中放入require_once("safe.php");(或者已包含所有php文件的文件)
这是一个丑陋的黑客......但它可以节省你的时间。

答案 3 :(得分:0)

很简单。把它放在你的每个文件的顶部或者放在一个公共的头文件中,每次开始调用它:

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

array_walk($_POST, mystriptag);

答案 4 :(得分: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预处理添加更多逻辑(启用magic quotes时的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。如果用户数据用作网址,则还需要另一种方法来防范javascript:网址等。