选择在ASP.NET中转义JavaScript的方法
在C#/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
<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(核心)
- 还有别的吗
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);