选择在ASP.NET中转义JavaScript的方法

选择在ASP.NET中转义JavaScript的方法,javascript,c#,asp.net,security,Javascript,C#,Asp.net,Security,在C#/ASP.NET中转义JavaScript的正确方法是什么? 例如: <script> var abc = '<%= def%>'; </script> <div onclick="myfunction('<%= Xyz%>')" /> var abc=“”; 这方面肯定有问题,但列出了不同的选项。有 System.Web.HttpUtility.JavaScriptStringEncode Syste

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

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

var abc=“”;
这方面肯定有问题,但列出了不同的选项。有

  • System.Web.HttpUtility.JavaScriptStringEncode
  • System.Web.Util.HttpEncoder.JavaScriptStringEncode
  • Microsoft.Security.Application.Encoder.JavaScriptEncode
  • Microsoft.JScript.GlobalObject.escape
  • System.Text.Encodings.Web.JavaScriptEncoder(核心)
  • 还有别的吗
这些方法的结果并不总是相同的,它们的文档似乎没有清楚地描述用例

在后一个示例中,我们可能应该同时使用HTML和JS编码,在不使用HTML编码的情况下,我能够利用System.Web.HttpUtility.JavaScriptStringEncode。然而,Microsoft.Security.Application.Encoder.JavaScriptEncode非常彻底,虽然我仍然会添加HTML编码以使其正确,但我看不到如何利用它。
JSFiddle:


每个方法都有一个首选用例吗?

针对您的特定用例的最佳答案可以从

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

这里的编码操作和顺序相当简单——您需要进行javascript编码。但是要注意
onclick
用例。如果您提到的
函数
是为执行代码而设计的,那么您可能需要提出额外的消毒层。更多信息请访问

至于实现,owasp备忘单提到现在已经过时,它已经被.NET Framework和.NET Core中现在的内容所取代。如果您在web.config中进行操作,则
HttpUtility
类可以在后台使用此选项,如下所示:

<httpRuntime ...
  encoderType="System.Web.Security.AntiXss.AntiXssEncoder,System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
如果def将对数据求值,则特别建议将其放入单独的元素中,将其作为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);

//外部js文件
var dataElement=document.getElementById('init_data');
//解码并解析div的内容
var abc=JSON.parse(dataElement.textContent);
但是,如果这是不可能的,因为
def
的计算结果是javascript函数调用,那么这种方法是不可能的。在这种情况下,我认为您需要更改您的设计,因为codegen通常是一个坏主意,您可以在后端或前端(使用适当的前端框架)执行完整的codegen。如果出于某种奇怪的原因,您无法执行这些选项中的任何一个,那么您需要对嵌套上下文(HTML中的JS)进行编码,此外,还需要对生成的javascript调用进行清理

第二个例子
应该用于规则3,因此
HttpUtility.JavaScriptStringEncode
应该足够了。但是,如果您的函数执行该参数,则还应该对其进行清理

<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);