如果您希望在 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 编码问题。