我一直在阅读一篇博文,我看到了一些说JS编码漏洞的内容。在下面的示例代码中,如果用户输入以下内容:
\x3cscript\x3e%20alert(\x27pwnd\x27)%20\x3c/script\x3e
,它说JS会将它呈现为HTML,这对我来说很奇怪。我试过了,他是对的。
@{
ViewBag.Title = "Home Page";
}
<h2 id="welcome-message">Welcome to our website</h2>
@if(!string.IsNullOrWhiteSpace(ViewBag.UserName)) {
<script type="text/javascript">
$(function () {
//ViewBag.Username value comes from Controller.
var message = 'Welcome, @ViewBag.UserName!';
$("#welcome-message").html(message).hide().show('slow');
});
</script>
}
我的问题是,为什么Javascript会自动解码已编码的字符串?或者它与jQuery的html()
函数有什么关系呢? OP说使用Ajax.EncodeJavascriptString()
方法来解决这个问题。但为什么我需要编码已编码的字符串?我检查了jQuery的网站,并没有提到类似html()
方法的内容。
如果您想查看整篇博文,请访问此地址http://weblogs.asp.net/jgalloway/archive/2011/04/28/preventing-javascript-encoding-xss-attacks-in-asp-net-mvc.aspx
答案 0 :(得分:3)
查看HTML结果:
<script type="text/javascript">
$(function () {
var message = 'Welcome, \x3cscript\x3e alert(\x27pwnd\x27) \x3c/script\x3e!';
$("#welcome-message").html(message).hide().show('slow');
});
</script>
然而,JS字符串包含一些character escape sequences并且等于
'Welcome, <script> alert("pwnd") </script>!'
因此,我们希望通过使用转义这些转义序列(包括\n
或\t
之类的简单事物)以及JS字符串分隔符'
和"
@Encoder.JavaScriptEncode
。