strip_tags() 非常不安全吗?

信息安全 php xss
2021-09-09 15:37:51

我一直用它strip_tags来防止 XSS 攻击,但今天我看到一个帖子说它非常不安全。正如手册所说,它不会检查格式错误的 HTML!

这是真的吗?

我能做些什么来防止 XSS?

2个回答

要防止 XSS,您需要:

  1. 验证您将要处理的所有用户输入(例如 - 如果 id GET 参数应该是一个数字,请确保它与例如 PHP 的is_number()函数或使用过滤器扩展)。这不仅应包括 GET / POST 参数,还应包括 cookie 名称、cookie 值、HTTP 标头、上传的文件名等。攻击者可以通过多种方式操纵请求。如果您需要接受并显示来自用户的 HTML 内容(例如在 CMS 应用程序中),请使用经过充分测试的HTMLPurifier库来过滤掉 Javascript 和其他 XSS 有效负载,并只留下干净、净化的 HTML。

  2. 显示值时使用上下文输出编码(有时称为“转义”)。关于如何编码用户提供的值有不同的规则,无论它是否出现在:

    • HTML 上下文,例如 <div>{$_GET['id']}</div>
    • HTML 属性上下文,例如 <div class='{$_GET['class']}'>
    • Javascript 上下文,例如 <script> var a = '{$_GET['id']}'</script>
    • CSS上下文例如 <div style='background:url({$_GET['image']})'>

最好参考OWASP XSS Prevention Cheat Sheet中描述的推荐规则。仔细阅读并遵守它 - XSS 是当今 Web 应用程序面临的第二大风险,因此您确实需要防范它。另请参阅有关 XSS 的 OWASP 教程视频

您应该使用上下文编码。请参阅owasp xss 预防备忘单您必须根据输出的位置进行不同的编码。例如,strip_tags 将遗漏以下输入,但如果输出位于 html 文本输入的 value 属性中,则会导致 xss:" autofocus onfocus="alert(1)