如何使用preg_replace()来限制(不阻止)XSS?

时间:2015-03-22 21:50:09

标签: php

跟随此处:http://www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL

我不太明白这里的意图(我的代码使用了上面引用的教程的一部分):

// XSS protection to avoid printing the value
/* Developer's Note: Not actually sure what the purpose of this is, or how it protects. */
$id = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $id);
$uname = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $uname);

我想我只是不理解reg ex,但我的猜测是我们正在消除任何不合理的字母数字字符,并且这样做,我们至少限制了传统JS标签的有效性。

2 个答案:

答案 0 :(得分:0)

正确的正则表达式的目的是正确的。它正在删除任何不是字母数字,下划线或短划线的字符(-)。

这足以防范XSS,因为大多数攻击都依赖于注入或存储任意JavaScript字符串,并且该字符集对于存储任何有效的XSS而言太有限了。

注意:我说你的正则表达式就足够了。不一定是preg_replace自己。

答案 1 :(得分:0)

正则表达式只允许使用字母数字字符,下划线和短划线。

我假设$uname$id是来自POST,GET或COOKIE变量的用户输入。因此,如果要打印这些变量,这可以保护您免受XSS的攻击。如果用户要将一个脚本(例如<script>...</script>)注入变量,它会将其剥离到script...script,这将保护输出免受任何恶意注入。