Rest 中 XSS 攻击的最佳实践 Api

Best Practice For XSS Attacks in Rest Api

我已经阅读了很多相关内容,但无法确定哪种方式最好。 我有一个网络应用程序和一个为客户服务的 java 休息应用程序。 在 rest api 和 frontend 中使用参数来防止 xss 攻击的最佳方法是什么?

当涉及到 XSS 时,唯一可能的选择是验证用户输入,任何类型的用户输入,无论是从浏览器还是以任何其他方式(如从终端客户端)传递的。

这取决于您关注的场景。 如果它只是没有 HTML 内容的数据那么你不需要担心 XSS。 否则,只需删除 <,> 符号或将它们转换为字符编码字符串就足够了。 您也可以避免使用 innerHTML 将新内容附加到文档,使用 innerText 代替,即使有 XSS 内容不会执行。

但是当 api 响应 returns HTML 内容以及您需要在某处显示的内容时,它会变得有点复杂。在这种情况下,避免在 HTML 片段中直接显示用户输入 - 尝试字符编码或删除 <> 符号,它将是还好

与任何深度防御一样重要,因此应对用户提供的任何输入进行验证和编码。编码非常重要,因为可能被认为是恶意的是上下文相关的。例如,可能安全的 HTML 可能是 SQL Injection attack.

REST API 中的参数可能会被保存,这意味着它们会从后续请求中返回,或者结果可能会在请求中反映给用户。这意味着您可以同时获得 reflected and stored XSS attacks. You also need to be careful about DOM Based XSS attacks. A more modern categorization that addresses overlap between stored, reflected, and DOM XSS is Server XSS and Client XSS.

OWASP 有很棒的 Cross Site Scripting Prevention Cheat Sheet that details out how to prevent cross site scripting. I find the XSS Prevention Rules Summary and the Output Encoding Rules Summary 部分,非常方便。

最大的收获是浏览器根据上下文以不同的方式解析数据,因此您不只是 HTML Entity Encode the data everywhere 非常重要。这意味着做两件事很重要:

  • Rule #0 - 只在允许的位置插入不受信任的(用户提供的)数据。仅将 HTML 文档中的数据插入规则 #1-5 定义的“槽”中。

  • 当您将数据插入其中一个受信任的插槽时,请遵循该特定插槽的编码规则。同样,规则在之前链接的 Cross Site Scripting Prevention Cheat Sheet.

    中有详细说明

还有一个DOM based XSS Prevention cheat sheet。和服务器端XSS作弊sheet一样,它提供了一套规则来防止基于DOM的XSS。