以下哪种方法可以更好地防止XSS攻击?



我正在实施输入编码以防止XSS攻击,我有几个问题。

  1. 对输入进行编码并将编码数据存储在数据库中是否更好?如果是这样,你如何处理整个项目中的字符串比较?您是否也对字符串进行编码以进行比较?这似乎是一个"不太好"的方法,因为我必须调整整个项目,未来的程序员每次比较两个字符串时都必须记住这一点。

  2. 我应该将输入直接扔到数据库中并对其进行编码作为响应吗?这似乎是一个更好的方法,但我不太确定。这就是我在这里发帖的原因。另外,如果这是首选方式,是否有任何数据库管理应用程序(如phpMyAdmin等(直接从数据库执行JavaScript?

这是我第一次这样做,所以我希望从更有经验的开发人员那里得到一些见解。

我之前已经回答过很多次了,但 2 绝对是正确的方法,但让我们稍微调整一下。

在进入的过程中,您需要验证数据以确保数据根据域有效。例如,您可能希望禁止某些字符(或者更好的是,使用允许字符的白名单(。例如,没有理由允许一个人的名字包含"<"。如果包含无效输入,我们将拒绝该请求。 这可能会阻止一些攻击,但绝对不是全部。

输出转义 当我们将数据从一个上下文传输到另一个上下文时,我们应用。我们希望确保数据保持数据不变。因此,当我们将数据插入SQL时,我们使用预准备语句,当我们想将数据放入XML或HTML时,我们会对这些语句进行编码。有不同的上下文,我们需要针对正确的上下文进行编码。请参阅 OWASP XSS 预防备忘单。

在数据库中编码和存储编码值的麻烦是:

  1. 您不知道正确的编码。数据是否应该显示在 HTML 属性中、标签之间等?不同的上下文需要不同的编码。
  2. 如果编码功能错误,并且您错过了某些内容怎么办。如果存储编码数据,则必须返回并修复所有错误编码的数据,而不仅仅是更新编码函数
  3. 如果要在不需要编码的上下文(例如移动应用(中显示数据,该怎么办?然后它会看起来很丑。

这些天我的首选方法是使用像 react 这样的可靠模板框架(它也为您正确编码数据(。

最新更新