代码之家  ›  专栏  ›  技术社区  ›  roland

使用jQuery或标准HtmlHelpers防止ASP.NET MVC中的跨站点脚本编写

  •  2
  • roland  · 技术社区  · 14 年前

    我正在构建一个AJAX驱动的ASP.NET MVC应用程序。 出于某种原因,我需要在单击submit按钮时动态添加一些DOM元素。这是通过jQuery.append()完成的。

    插入的一个元素是textarea,在提交之前必须对其数据进行分析,以确保不能执行跨站点脚本。

    我们知道Html.Encode()工作得很好,但必须在脚本标记外部声明。我对jQuery所做的一切都嵌入在一个脚本标记中。

    1)有没有办法利用脚本标记中的Html.Encode()呢?

    2)我如何使用jQuery来实现这一点?

    最坏的情况下,我可以使用HttpUtility.HtmlEncode(),这是在服务器端调用的。

    谢谢你的帮助。

    罗兰

    4 回复  |  直到 14 年前
        1
  •  3
  •   Yisroel    14 年前

    如果您试图保护agains跨站点脚本,那么无论如何都应该在服务器上执行,因为可以很容易地绕过客户端验证。

        2
  •  2
  •   Artiom Chilaru    14 年前

    据我所知,您正在注入的数据是通过客户端调用接收的,而不是在服务器端构建页面时接收的。在这种情况下,你可以替换 $(dest).append(data); 具有 $(dest).append($('<div>').text(data)); 使用.text vs.html将已经清除字符串。。

    不管你做什么,我真的推荐看菲尔·哈克和斯科特·汉斯曼的这段视频 http://live.visitmix.com/MIX10/Sessions/FT05 . 它们展示了使用XSS和csr攻击网站的不同方法,以及保护自己的方法——正是您所需要的:)

        3
  •  0
  •   Brian Mains    14 年前

    你用的是什么版本的MVC?我不确定我是否理解完整的上下文,所以我将尝试从多个角度来覆盖它(对于我能想到的场景,肯定还有更多)。对于MVC 2,您有了新的支持:<%;Model.FirstName%>对数据进行编码,这与MVC 1中的<%=Html.encode(Model.FirstName)%>等价。

    您应该能够在视图中的JS中执行此操作,如:

    <script type="text/javascript">
       $(document).ready(function() { $("#this").html('<%= "Some HTML to write" %>');
    </script>
    

    我以为我做了。。。如果没有其他选择的话。有一个客户端使用JS escape和unescape进行编码,但它的编码/解码方式与服务器不同。。。你自己试试看,会用%20和其他的改变来代替空格。

    最后,JQuery可以使用$.get(“/controller/action”,function(data){/*data here*/}调用服务器操作方法,您可以使用该方法进行编码,但效率很低。

    哦。

        4
  •  0
  •   Jason Robertson    11 年前

    您可以使用ASP.NET内置实用程序

    var消息='欢迎,@Ajax.JavaScriptStringEncode(ViewBag.UserName)!';

    或者你可以使用反XSS库

    var消息='欢迎,@Encoder.JavaScriptEncode(ViewBag.UserName,false)!';

    http://weblogs.asp.net/jgalloway/archive/2011/04/28/preventing-javascript-encoding-xss-attacks-in-asp-net-mvc.aspx