在 ASP.NET 4.5 中,我应该如何编码用作 JavaScript 变量的字符串,以防止 XSS 攻击

2023-12-27

我知道有几种方法可以做到这一点,但它们都有一些缺点。是否有一种“公认”的、被认为是最好的方法?

我以前用过Microsoft.Security.Application.AntiXss.JavaScriptEncode()这很棒,但 AntiXSS 已经停产,因为从 4.5 开始,该编码器现已包含在 .NET 中。

然而,由于某种原因,System.Web.Security.AntiXss.AntiXssEncoder不包括JavaScriptEncode method.

There's System.Web.HttpUtility.JavaScriptStringEncode(),但它使用黑名单方法进行编码,因此它不太可能像白名单编码器一样好。

我看到了一些使用建议System.Web.Script.Serialization.JavaScriptSerializer.Serialize(),但这只是调用HttpUtility.JavaScriptStringEncode().

那么,目前最受接受的白名单方法是什么,用于对写为 JS 变量的值进行编码?


如果您希望在 a 中包含 JavaScript 代码<script>像这样块:

<script>
var myVariable = '<%=thisIsWrong %>';
</script>

那么在这个背景下HttpUtility.JavaScriptStringEncode https://stackoverflow.com/a/20903746/413180应该使用。该函数还可以正确编码特殊字符,因此如果</script>如果要在脚本标记中呈现,以尝试关闭为 XSS 攻击做好准备的 HTML 脚本标记,则它将呈现为:

\u003c/script\u003e

这是 JavaScript 将其理解为的正确编码</script>,但浏览器不会将其解释为文字结束脚本标记。一些天真的编写的 JavaScript 编码例程不会转换它,因为序列不包含\, " or '人物。

如果您不确定不渲染结束脚本标记,则可能会发生类似的攻击。想象一下这是您应用程序的输入:

</script><script>alert(1)</script>

在浏览器中呈现为

<script type="text/javascript">

alert('</script><script>alert(1)</script>');

</script>

浏览器将解释以以下结尾的脚本标签alert('</script>并简单地执行新脚本标记中的内容。

随着JavaScriptStringEncode函数 this 是安全的,因为它呈现为:

<script type="text/javascript">

alert('\u003c/script\u003e\u003cscript\u003ealert(1)\u003c/script\u003e');

</script>

其中不包含</script>供浏览器解释。

有 System.Web.HttpUtility.JavaScriptStringEncode(),但它使用 黑名单方法进行编码,因此它不太可能像 白名单编码器。

.NET 中的一些其他编码函数 https://stackoverflow.com/a/3437959/413180确实使用黑名单方法,但是在我自己的测试中JavaScriptStringEncode似乎很充足。

The JavaScript 的 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 is

除字母数字字符外,转义所有小于 256用\xHH格式来防止切换出数据值 进入脚本上下文或另一个属性。

所以你可以轻松地编写自己的代码来遵守这一点。

请注意,如果您想在属性标签中包含代码:

<a href="http://example.com" onclick="alert('<%=wrong>')">Click</a>

那么 OWASP 方法意味着您也不必关心 HTML 编码(因为实际上不会输出具有特殊含义的 HTML 字符)。没有(例如有JavaScriptScriptEncode)你也需要 HTML 编码。

说了这么多,更安全的方法是像回答我的问题一样处理它在外部 JavaScript 文件中插入动态值的安全方法 https://stackoverflow.com/q/21428259/413180. Use data-属性将动态值放置在 DOM(HTML 中)中,然后使用 JavaScript 提取这些值。这将防止所有 JavaScript 编码问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ASP.NET 4.5 中,我应该如何编码用作 JavaScript 变量的字符串,以防止 XSS 攻击 的相关文章

随机推荐