2012-10-19 56 views
3

我改變了我的代碼並不需要這個答案了,但我還是問出於好奇的緣故。XSS安全JsonResult作爲字符串

經過一番搜索,我發現this question和其他幾個人喜歡它。我一直在尋找一種方法來獲取JsonResult返回的JSON,並在視圖中使用它。這個問題和其他問題似乎是不安全的。一些消息來源,我發現建議是這樣的:

所有的
@Html.Raw(Json.Encode(Model)) 

首先,Json.Encode似乎不存在了。其次,如果我使用Raw,那麼不僅JSON語法未經編碼,模型內容也不是。如果用戶在他們的信息中輸入<script>標籤,它會被吐出並執行。如果我不使用Raw,JSON也會被視圖作者轉義。

我想這樣做的原因是因爲我有一個使用jQuery的一些模板頁面,並在第一次加載,我想通過讓視圖輸出解僱他們的腳本標記仍然使用模板。

回答

0

它是不是所有的JSON輸出可以安全地在HMTL用了一個很善於觀察 - 事實上,即使使用Json.NET(這是真棒)的默認配置可導致XSS漏洞。

不管怎麼說,有沒有廣告約這樣,Json.Encode安全在構建@Html.Raw(Json.Encode(obj))<script>上下文中使用。 (結果也是安全的「原始」在使用單引號的屬性,但不是一個使用雙引號或沒有引號)。

這是因爲Json.Encode應用編碼的U \至<>&,和在JSON字符串文字'字符(它也逃脫ASCII控制字符,因此將播放用XML漂亮以及)。例如,

Json.Encode(new { hello = "\0\"\b\r\t<>&'" }) 

導致

{"hello":"\u0000\"\b\r\t\u003c\u003e\u0026\u0027"} 

由於Json.Encode方法確實還存在很可能含組件(System.Web.Helpers)或命名空間沒有被正確使用。

我知道這個問題已經過了3年過時了〜但是由於這個問題是我在短時間搜索後發現的最好的問題,我不得不自己搜索一個答案,因爲許多其他來源包含揮手或忽略完全發佈..所以是的,我想要一個死靈法師徽章。