我有一个正则表达式作为抵御 XSS 的第一道防线。
public static function standard_text($str)
{
// pL matches letters
// pN matches numbers
// pZ matches whitespace
// pPc matches underscores
// pPd matches dashes
// pPo matches normal puncuation
return (bool) preg_match('/^[\pL\pN\pZ\p{Pc}\p{Pd}\p{Po}]++$/uD', (string) $str);
}
其实是来自Kohana 2.3 .
这运行在公共(public)输入的文本上(从来没有 HTML),如果它没有通过这个测试则拒绝输入。文本始终显示为 htmlspecialchars()
(或更具体地说,Kohana's flavour,它添加了字符集等)。我还在输出上放置了一个 strip_tags()
。
当客户想输入一些带括号的文本时遇到了问题。我考虑过修改或扩展帮助程序,但我还有一个次要想法 - 如果我允许使用双引号,我真的有任何理由需要验证吗?
我可以只依赖输出转义吗?
最佳答案
依靠正则表达式来过滤危险的 XSS 攻击从来都不是安全的。尽管您不依赖它们,但如果使用得当,输出转义和输入过滤将杀死各种攻击。因此,当真正不需要正则表达式的帮助时,将正则表达式作为“第一道防线”是没有意义的。正如您和您的客户所发现的,像这样使用它们只会使事情复杂化。
长话短说:如果您使用 html_entities
或 htmlspecialchars
来转义您的输出,您不需要正则表达式,也不需要 strip_tags
要么。
关于php - 正则表达式作为抵御 XSS 的第一道防线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3748043/