我正在从令人讨厌的XSS攻击中恢复,并意识到我从未对我网站上的几个表单上的输入进行清理。我使用Notepad ++的Find In Files功能在我的所有PHP文件中搜索$_POST
,并获得了近5,000个结果。现在,我真的不想去为这些结果中的每一个手动添加strip_tags
,但是替换所有人都不会做到这一点......而且当谈到像正则表达式这样的东西。
有没有什么方法可以减少这种繁琐?
答案 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:
网址等。