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

XSS preventing for parameters passed to JS code file

本文关键字:代码 文件 参数 JS XSS      更新时间:2023-09-26

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

  • 包含一个javascript文件,用于执行主要逻辑
  • <script>标记,包括一个JS对象,该对象具有此JS代码的参数,部分取自之前的查询参数

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

任何关于图书馆的建议&可能的方法?我们在JVM环境中运行。

最简单、最简单、因此更安全的方法是使用数据属性来表示用户提供的动态值。

这样,您只需要担心HTML编码,而不需要担心OWASP推荐的复杂十六进制实体编码('x00(。

例如,您可以有:

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

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

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

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

然后,您可以使用类似JQuery的东西来轻松地检索JavaScript:中的数据属性值

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

简单而安全。

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

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

您需要确保[PARAMETER]不会脱离带引号的字符串。

在这种情况下,需要转义的是'字符和结束的</script>标记。注意:考虑"escape the escape"攻击,攻击者发送字符串'',该字符串被转义为''',然后返回到'(您从开始的位置返回(。

正如OWASP所指出的,通常更安全

使用''xHH格式转义所有小于256的字符

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