php - 正则表达式作为抵御 XSS 的第一道防线

标签 php xss kohana

我有一个正则表达式作为抵御 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_entitieshtmlspecialchars 来转义您的输出,您不需要正则表达式,也不需要 strip_tags 要么。

关于php - 正则表达式作为抵御 XSS 的第一道防线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3748043/

相关文章:

php - 在接下来的第 4 列中查找 CI 数据库错误

javascript - 如何正确应对Chrome X-XSS-Protection?

PHP 脚本没有被执行

php - 如何在 Kohana 中使 URL 中的参数名称默认并隐藏?

php - 如何在 Kohana PHP Framework 的 url 路由中显示用户名?

php - 使用 Kohana Request 时如何设置 CURL 选项

php - 具有十六进制值的正则表达式使 preg_replace 在 php 5.4 中返回 null

php - 如何在 Laravel 中执行 MYSQL 查询?

php - CakePHP 使用 JOIN 查找方法

html - Django:安全验证不受信任的 HTML 输入