如何将HTML保存到数据库并正确检索它

时间:2014-02-09 18:00:06

标签: asp.net-mvc asp.net-mvc-4 razor xss

这些天学习安全:) 我需要允许用户在表单中输入文本并允许他们使用一些HTML标记:粗体,斜体,列表等,并防止他们添加一些危险的JavaScript代码。
所以我使用this whitelist implementation来清理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>

<p>&lt;的Becaouse我认为我需要首先解码它:

<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(粗体,列表等)?

3 个答案:

答案 0 :(得分:20)

经验法则如下:

  1. 在您的数据库中存储RAW HTML,无需任何编码或清理。 SQL服务器不关心您是否存储包含XSS代码的字符串。
  2. 将此输出显示到页面时,请确保已对其进行清理。
  3. 所以:

    [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),那么@ razor函数会对SanitizeHtml函数的结果进行HTML编码,这可能不是您要查找的内容。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以将HTML列的数据类型为VARBINARY(MAX)的HTML文件保存在数据库中。

  1. 将HTML文件转换为二进制文件(code project link

  2. 将数据插入到类似于此示例代码的列中:

Declare @HTML   Varbinary(MAX) = Set HTML Varbinary code here 

Insert into table_name (htmlcoulmn)
Value @HTML
  1. 将数据加载到数据库中,当需要加载文件时,应通过以下代码将htmlcolumn转换为Nvarchar(max):
Select CAST(htmlcolumn as nvarchar(MAX)) As HTMLCODE
FROM Table_Name

如果此解决方案有问题,谢谢您给我写评论。

希望您能做到最好