代码之家  ›  专栏  ›  技术社区  ›  alex

Regex作为针对XSS的第一道防线

  •  10
  • alex  · 技术社区  · 15 年前

    我有一个regex作为对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() 输出时。

    当客户想要输入带括号的文本时,遇到了一个问题。我考虑修改或扩展助手,但我也有第二个想法——如果我允许双引号,是否真的有任何理由需要验证?

    我可以仅仅依靠输出上的转义吗?

    1 回复  |  直到 14 年前
        1
  •  6
  •   Chris Laplante    15 年前

    依靠正则表达式过滤危险的XSS攻击是不安全的。虽然您不依赖它们,但正确使用输出转义和输入过滤会杀死各种攻击。因此,当不需要正则表达式的帮助时,将它们作为“第一道防线”是没有意义的。正如您和您的客户所发现的,只有在这样使用时,它们才会使事情复杂化。

    长话短说:如果你用 html_entities htmlspecialchars 为了逃避输出,您不需要正则表达式,也不真正需要 strip_tags 或者。

    推荐文章