2014-02-09 113 views
9

這些天學習安全:)
我需要允許用戶在表單中輸入文本並允許他們使用一些HTML標記:粗體,斜體,列表等,並防止它們出現添加一些危險的JavaScript代碼。
所以我用this whitelist implementation消毒HTML。
但我仍然對如何以正確的方式保存和顯示感到困惑。
所以在這裏我所做的:
型號:如何將HTML保存到數據庫並正確檢索

public class Post 
    { 
     [AllowHtml] 
     public string Data { get; set; } 
    } 

控制器:

[HttpPost, ActionName("Create")] 
     [ValidateAntiForgeryToken] 
     public ActionResult Create(Post model) 
     { 
      // Decode model.Data as it is Encoded after post 
      string decodedString = HttpUtility.HtmlDecode(model.Data); 
      // Clean HTML 
      string sanitizedHtmlText = HtmlUtility.SanitizeHtml(decodedString); 

      string encoded = HttpUtility.HtmlEncode(sanitizedHtmlText); 

查看:

@using (Html.BeginForm("Create", "Home", FormMethod.Post)) {  
    @Html.AntiForgeryToken() 
    @Html.TextAreaFor(a=>a.Data) 
    <input type="submit" value="submit" /> 
} 

所以,當我張貼的形式我看到:

<p>Simple <em><strong>whitelist</strong> </em>test:</p> 
<ul> 
<li>t1</li> 
<li>t2</li> 
</ul> 
<p>Image:</p> 
<p>&lt;img src="http://metro-portal.hr/img/repository/2010/06/medium/hijena_shutter.jpg" /&gt;</p> 

Becaouse的<p>&lt;我認爲我需要它首先解碼:

<p>Simple <em><strong>whitelist</strong> </em>test:</p> 
<ul> 
<li>t1</li> 
<li>t2</li> 
</ul> 
<p>Image:</p> 
<p><img src="http://metro-portal.hr/img/repository/2010/06/medium/hijena_shutter.jpg" /></p> 

然後我清理它針對白名單,我得到消毒HTML:

<p>Simple <em><strong>whitelist</strong> </em>test:</p> 
<ul> 
<li>t1</li> 
<li>t2</li> 
</ul> 
<p>Image:</p> 
<p> 

1)我應該保存它像這樣在數據庫?
2)或者我需要編碼這個結果,然後將其保存到數據庫(編碼波紋管)?

&lt;p&gt;Simple &lt;em&gt;&lt;strong&gt;whitelist&lt;/strong&gt; &lt;/em&gt;test:&lt;/p&gt; 
&lt;ul&gt; 
&lt;li&gt;t1&lt;/li&gt; 
&lt;li&gt;t2&lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;Image:&lt;/p&gt; 
&lt;p&gt; 

在這裏,我很困惑,如果我把它放在這樣的觀點:

@Model.Data 

我得到這個的觀點:

&lt;p&gt;Simple &lt;em&gt;&lt;strong&gt;whitelist&lt;/strong&gt; &lt;/em&gt;test:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;t1&lt;/li&gt; &lt;li&gt;t2&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Image:&lt;/p&gt; &lt;p&gt; 

<p>Simple <em><strong>whitelist</strong> </em>test:</p> <ul> <li>t1</li> <li>t2</li> </ul> <p>Image:</p> <p> 

那麼怎麼做才能正確顯示這個HTML(粗體,列表)等等)?

回答

13

經驗法則如下:

  1. 存儲在數據庫中的RAW HTML沒有任何編碼或sanitizings。如果你存儲一些包含XSS代碼的字符串,SQL服務器不關心。
  2. 將此輸出顯示到您的頁面時,請確保已將其清除。

所以:

[HttpPost, ActionName("Create")] 
[ValidateAntiForgeryToken] 
public ActionResult Create(Post model) 
{ 
    // store model.Data directly in your database without any cleaning or sanitizing 
} 

,然後顯示在:

@Html.Raw(HtmlUtility.SanitizeHtml(Model.Data)) 

注意我是如何使用的Html.Raw幫手這裏,以確保你沒有得到雙重HTML編碼輸出。HtmlUtility.SanitizeHtml函數應該已經負責清理值並返回一個安全的字符串,您可以在視圖中顯示它,並且不會對其進行進一步編碼。另一方面,如果您使用@HtmlUtility.SanitizeHtml(Model.Data),那麼@剃鬚刀功能將HTML編碼SanitizeHtml函數的結果,這可能不是您要查找的結果。

+0

啊哈......清晰:)所以後門柱基本上我可以將此保存到數據庫'

這是安全文本和危險如下> <腳本> alert('attack'); < /腳本>

'只是在視圖上使用SanitizeHtml。我認爲我不能在數據庫中保存html標籤。我得到的這個值是從視圖到創建方法的模型(它增加了&qt,lt等)。 – 1110

+0

是的,你的理解是正確的。將原始HTML存儲在數據庫中沒有任何問題。 –

+0

謝謝Darin :) – 1110

1

爲框架4.5,使用MVC 5,使用 @ Html.Raw(WebUtility.HtmlDecode(item.ADITIONAL_INFORMAtION))

相關問題