首页 > 解决方案 > 选择一种在 ASP.NET 中转义 JavaScript 的方法

问题描述

在 C#/ASP.NET 中转义 JavaScript 的正确方法是什么?例如:

<script>
var abc = '<%= def%>';
</script>
<div onclick="myfunction('<%= Xyz%>')" />

肯定有关于此的问题,但列出了不同的选项。有

这些方法的结果并不总是相同的,并且它们的文档似乎没有清楚地描述用例。

在后一个示例中,我们可能应该同时使用 HTML 和 JS 编码,当不使用 HTML 编码时,我能够利用 System.Web.HttpUtility.JavaScriptStringEncode。然而 Microsoft.Security.Application.Encoder.JavaScriptEncode 是如此彻底,虽然我仍然会添加 HTML 编码以使其正确,但我看不到如何利用它。
JSFiddle:https ://jsfiddle.net/1afn5dky/

每种方法都有首选用例吗?

标签: javascriptc#asp.netsecurity

解决方案


您的特定用例的最佳答案可以来自OWASP Cheatsheet Rule #3

一般来说,这归结为 1) 正确的编码操作及其顺序和 2) 实现。

此处的编码操作和顺序相当简单——您需要进行 javascript 编码。不过要注意onclick用例。如果function您提到的设计用于执行代码,您可能需要提出额外的清理层。此 SO 线程中的更多信息

至于实现,owasp 备忘单提到现在已经过时的AntiXSS,它已被现在存在于 .NET Framework 和 .NET Core 中的AntiXssEncoder 类所取代。如果您在 web.config 中遵循此设置,则可以在HttpUtility后台使用它,如下所示:

<httpRuntime ...
  encoderType="System.Web.Security.AntiXss.AntiXssEncoder,System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

如果没有这个设置,HttpUtility 类会在后台使用 HttpEncoder。(在您的特定用例中,JavaScriptStringEncode两个类的方法实际上是相同的)。

在您的第一个场景中:

<script>
var abc = '<%= def%>';
</script>

如果 def 将评估数据规则 3.1特别建议将它们放入单独的元素中,将它们评估为 json 字符串,然后使用 json 解析器读取数据:

<div id="init_data" style="display: none">
 <%= html_encode(def.to_json) %>
</div>

// external js file
var dataElement = document.getElementById('init_data');
// decode and parse the content of the div
var abc = JSON.parse(dataElement.textContent);

但是,如果这是不可能的,因为def计算结果为 javascript 函数调用,则这种方法是不可能的。在这种情况下,我认为您需要更改您的设计,因为 codegen 通常是一个坏主意,您可以在后端或前端(使用适当的前端框架)执行完整的 codegen。如果由于某种奇怪的原因您不能执行任何这些选项,那么您需要对嵌套上下文(HTML 中的 JS)进行编码,除此之外,您还需要对生成的 javascript 调用进行清理。

第二个例子<div onclick="myfunction('<%= Xyz%>')" />应该用于规则 3,这样HttpUtility.JavaScriptStringEncode就足够了。但是,如果您的函数执行参数,您还应该对其进行清理。


推荐阅读