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

Php 如何使用preg_replace()来限制(而不是阻止)XSS?,php,Php,以下是: 使用上述参考教程的一部分,我不太理解我的代码的意图: // 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

以下是:

使用上述参考教程的一部分,我不太理解我的代码的意图:

// 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);

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

你对regex的目的是正确的。它去除了任何不是字母数字、下划线或破折号的字符

这对于XSS是足够的保护,因为大多数攻击依赖于注入或存储任意JavaScript字符串,并且该字符集对于任何有效的XSS来说都太有限,无法存储


注意:我是说你的正则表达式就足够了。不一定是preg_替换iteself。

正则表达式只允许字母数字字符、下划线和破折号


我假设$uname和$id是来自POST、GET或COOKIE变量的用户输入。因此,如果您正在打印这些变量,这将保护您免受XSS攻击。如果用户将脚本(如…)注入变量,它会将其拆分为脚本…脚本,以保护输出免受任何恶意注入。

阅读有关SQL注入、XSS等的内容,这是我的想法,因此感谢您的确认。尽管如此,这显然是不够的:这段视频展示了一种创造性的进入方式。然而,这有点像锁前门。这几乎是不够的,但它确实阻止了攻击和/或使攻击者转向保护较少的东西。@VisWebsoft该视频确实显示了一个可以绕过过滤的示例,但问题是正则表达式太复杂了。如果你不局限于你的字符集,我同意正则表达式是一个糟糕的过滤器。视频中使用的方法与您发布的正则表达式不兼容。我在我的回答中加了一个注释来澄清这一点。