2014-02-09 115 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))

相关问题