我有一个正则表达式作为对抗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。
这是在公共输入的文本上运行的(没有HTML),并且如果它未通过此测试则拒绝输入。文本始终显示为htmlspecialchars()
(或更具体地,Kohana's flavour,它会在其他内容中添加字符集)。我还在输出上放了一个strip_tags()
。
客户在想要输入带括号的文本时遇到问题。我考虑过修改或扩展帮助程序,但我也有一个次要的想法 - 如果我允许双引号,我真的有任何理由需要验证吗?
我可以依靠输出转义吗?
答案 0 :(得分:6)
依靠Regexes过滤危险的XSS攻击绝不安全。虽然你不依赖它们,但输出转义和输入过滤,如果使用得当,会杀死所有类型的攻击。因此,当没有真正需要他们的帮助时,将正则表达作为“第一道防线”毫无意义。正如您和您的客户发现的那样,它们只会在使用时复杂化。
长话短说:如果您使用html_entities
或htmlspecialchars
来逃避输出,则不需要正则表达式,也不需要strip_tags
。