XSS 防止传递给 JS 代码文件的参数

XSS preventing for parameters passed to JS code file

我有以下流程:URL 带有查询参数,运行 在服务器端有一些逻辑,然后使用模板引擎生成存根 HTML 页面与

现在我想清理接收到的参数,以防止 XSS 注入。问题是其中一个参数有一个标记,所以我不想对验证过于严格(只是不允许所有可能的 XSS 字符听起来太严格),但我发现处理的大多数库纯 HTML,而不是 JS 代码(在 <script> 标签内)。当我阅读所有正则表达式解决方案时,我也感到有点不安,因为我在处理安全问题时习惯于信任开源 (具有单元测试而不是一堆正则表达式).

对图书馆和可能的方法有什么建议吗?我们运行在JVM环境中。

假设您想将参数分配为字符串,例如:

{
  ...
  x: '[PARAMETER]'
}

您要确保 [PARAMETER] 不会超出引用的字符串。

在这种情况下,您需要转义的是 ' 字符和结束的 </script> 标记。注意:考虑 "escape-the-escape" 攻击,攻击者发送字符串 \',它被转义为 \',它返回到 '(你从哪里回来了你开始了)。

正如 OWASP 指出的那样,

通常更安全

escape all characters less than 256 with the \xHH format

我邀请您阅读有关 XSS 攻击的 OWASP 页面,特别是 https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet#RULE_.233_-_JavaScript_Escape_Before_Inserting_Untrusted_Data_into_JavaScript_Data_Values

最简单、最简单且因此更安全的方法是使用 data attributes 表示用户提供的动态值。

这样你只需要担心 HTML 编码,none 复杂的十六进制实体编码 (\x00) 即 OWASP recommend.

例如,您可以:

<body data-token="@param.token" />

其中 @param.token 将输出查询字符串参数的 HTML 编码版本。例如page?token=xyz" 会输出

<body data-token="xyz&quot;" />

这将减轻您对 XSS 漏洞的担忧。

然后你可以使用 JQuery to easy retrieve the data attribute values in your JavaScript:

var token = $("body").data("token");

简单安全。