2010-04-20 48 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