javascript - 选择一种在 ASP.NET 中转义 JavaScript 的方法
问题描述
在 C#/ASP.NET 中转义 JavaScript 的正确方法是什么?例如:
<script>
var abc = '<%= def%>';
</script>
<div onclick="myfunction('<%= Xyz%>')" />
肯定有关于此的问题,但列出了不同的选项。有
- 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:https ://jsfiddle.net/1afn5dky/
每种方法都有首选用例吗?
解决方案
您的特定用例的最佳答案可以来自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
就足够了。但是,如果您的函数执行参数,您还应该对其进行清理。
推荐阅读
- java - 表“”不存在,跳过,表未映射
- python - 在 python 中导入 sklearn 时出错 - ImportError
- python - 如何逐字反转Python中的字符串?
- linux - 使用 GREP 在整个外显子组制表符分隔的文本文件中查找基因列表(大约 200 个)
- c# - 将 CosmosDB 提供程序用于 Entity Framework Core 和 Azure 表时出错
- javascript - 为什么firebase不部署放置在公共目录之外的文件?
- android - Android WorkManager PeriodicWorkRequest 执行问题
- java - java.lang.NoSuchMethodError:org.springframework.util.ReflectionUtils.accessibleConstructor
- docker - HaProxy 转发代理在 HTTP 上工作,但在 HTTPS 上给出 503
- android-studio - 如何在 Flutter 中仅为 OutlineButton 制作带下划线的边框