2010-04-20 55 views
2

我正在构建一个AJAX驱动的ASP.NET MVC应用程序。 由于某种原因,我需要在点击提交按钮时动态添加一些DOM元素。这是通过jQuery.append()完成的。防止ASP.NET MVC中的跨站点脚本 - 使用jQuery或标准HtmlHelpers

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

我们知道Html.Encode()很好用,但必须在脚本标签之外声明。我所做的所有jQuery都嵌入在脚本标记中。

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

2)我该如何用jQuery来完成这项工作?

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

感谢您的帮助。

罗兰

回答

3

如果你试图保护agains跨站点脚本,你应该做它的服务器上,无论如何,作为客户端验证可以很容易地绕过。

0

您使用的是什么版本的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转义和unescape,但它编码/解码以不同于服务器的方式...尝试自己看看,将替换%20和其他更改的空间。

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

HTH。

2

据我所知,您使用某些客户端调用,而不是在页面是建立在服务器端接收注入的数据。在这种情况下,你可以更换$(dest).append(data);$(dest).append($('<div>').text(data));使用.text与.html将已经消毒的字符串..

无论你做什么,我真的推荐Phil Haack和Scott Hanselman观看了这部视频http://live.visitmix.com/MIX10/Sessions/FT05。他们展示使用XSS和CSRS黑客网站不同的方式,并保护自己的方式 - 你需要的东西:)

+0

+1为Mix会话。我不确定文本是干什么的,但是可能需要JavascriptEncode(而不是HtmlEncode)Ajax操作中的值。混合会议真的解释了这一切。 – 2010-04-20 14:03:46