PHP OWASP TOP 5 -防止跨站点脚本(XSS)列表第4项和第5项


PHP OWASP TOP 5 - Protection against Cross-site scripting (XSS) list item 4 and 5

在https://www.owasp.org/index.php/PHP_Top_5#How_to_Determine_if_you_are_Vulnerable_2链接,标题P2下:跨站点脚本>如何预防它;第4项和第5项是这样写的:

  1. 第4项:自由文本输入只能安全地重新显示给用户使用HTML实体后
  2. item5:通过URL返回给用户的变量必须是URL编码的使用urlencode(),尽管不建议使用GET请求

我的问题

Q1

对于第4项,它明确地说只能,但我记得我读过htmlspecialchars()是足够的&比htmlentities()更有效。(htmlspecialchars优越性的示例源链接。请阅读Pornel_的评论:在PHP站点中避免xss攻击的最佳实践是什么?所以我在OWASP输入后感到困惑。我应该用htmlentities()替换我的htmlspecialchars(),而我将MySQL用户输入的数据作为html打印到屏幕上。

Q2

对于我的表单(添加文章,添加评论,给管理员发送电子邮件),我使用Post - Redirect - Session Variables流。(我的解释可能对你来说很愚蠢,但我的意思是我没有在我的流程的第三步使用GET。我没有使用GET,而是使用Session变量。)所以我仍然需要在Session变量的某个地方使用urlencode()吗?(注:即使你是,我不知道如何,这是我研究的另一个主题,目前我只想知道是或否和为什么,因为我在我的研究中找不到这个问题的答案。当然,如果您也定义HOW部分,将非常感谢)

提前致谢
致以最诚挚的问候

关注你为什么要做这两点,而不是如何做。"如何"应该只是一个提示,告诉你如何"可能"完成需求。但是,如果您只是使用其他人告诉您的内容,那么您就有可能无法完全理解原因,从而在不知不觉中重新引入安全风险。

4)这个建议试图避免用户"打破"你的输入/文本区域字段。自己检查一下,如何在你的表格中做到这一点,并采取相应的行动。通常,文本输入可以用正确的引号分隔:

$value = '''/>alert("hello");';echo '

所以在这种情况下,过滤双引号就足够了(如果我错了请纠正我)。但是过滤掉你不需要的东西总是更好的。选择白名单,而不是黑名单过滤器。

5)这试图避免你的URL得到畸形。现在我不能给你一个很好的攻击示例,但即使是一个错误的url也可能会使你的应用程序无法使用。

顺便说一句,典型的PHP会话id是纯文本的,URL是安全的。最好将它们存储在设置为"仅http"的cookie中。对于正常的会话处理,除了会话id之外,不需要其他任何东西。

所以,是的。使用你提到的这些技巧,但要了解它旨在防止的攻击,而不是因为别人也告诉你就使用它们。