问题描述
在Wrox.Professional.ASP.NET.MVC.4.Oct.2012这本书里第3章里提到在javascript里处理用户输入的字符串时要使用Ajax.JavaScriptStringEncode以防止XSS攻击,并给了一个例子:如果用户名是“x3cscriptx3e%20alert(x27pwndx27)%20x3c/scriptx3e”在使用下面的javascript时就有XSS危险<scripttype="text/javascript">$(function(){varmessage='Hello@ViewBag.Username';$("#message").html(message).show('slow');});</script>应该使用下面的javascript:<scripttype="text/javascript">$(function(){varmessage='Hello@Ajax.JavaScriptStringEncode(ViewBag.Username)';$("#message").html(message).show('slow');});</script>但是我试验了一下,结果直接报异常,然后我把上面的用户名里的2个%20换成空格,就执行了javascript,弹出了pwnd,我发现原本直接使用ViewBag.Username会进行的HTML编码,使用了Ajax.JavaScriptStringEncode后就不会进行html编码了,而是把<,>尖括号编码成了unicode了。查了msdnAjax.JavaScriptStringEncode会把字符串转成Json。查了网上一些资料也是说在Javascript里使用用户输入的字符串时要使用Ajax.JavaScriptStringEncode。真不知道是什么原因,请有知道的朋友解答,谢谢!
解决方案
解决方案二:
我也测试了下。发现一个如果你的x3cscriptx3e%20alert(x27pwndx27)%20x3c/scriptx3e是从客户端提交的话,Ajax.JavaScriptStringEncode编码后(\x3cscript\x3ealert(\x27pwnd\x27)\x3c/script\x3e)不会执行。但是如果此段代码是你从后台赋值的话,使用Ajax.JavaScriptStringEncode编码后(n<script>alert('pwnd')</script>)是可以执行的。
解决方案三:
解决方案四:
这行改成:varmessage='Hello@Html.Raw(Ajax.JavaScriptStringEncode(ViewBag.Username))';如果想要输出一个javascript字符串的话,必须要加上Html.Rasw才可以。