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

Asp.net mvc 如何将HTML保存到数据库并正确检索它,asp.net-mvc,asp.net-mvc-4,razor,xss,Asp.net Mvc,Asp.net Mvc 4,Razor,Xss,如今的学习安全:) 我需要允许用户在表单中输入文本,允许他们使用一些HTML标记:粗体、斜体、列表等,并防止他们添加一些危险的JavaScript代码。 因此,我已经习惯于清理HTML 但我仍然对如何以正确的方式保存和显示它感到困惑。 所以我所做的就是: 型号: 控制器: [HttpPost, ActionName("Create")] [ValidateAntiForgeryToken] public ActionResult Create(Post model

如今的学习安全:)
我需要允许用户在表单中输入文本,允许他们使用一些HTML标记:粗体、斜体、列表等,并防止他们添加一些危险的JavaScript代码。
因此,我已经习惯于清理HTML
但我仍然对如何以正确的方式保存和显示它感到困惑。
所以我所做的就是:
型号:

控制器:

[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);
视图:

如果我把它放在这样的视图上,我会感到困惑:

@Model.Data
我从视图中了解到:

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

Simple白名单测试:

  • t1
  • t2
    • 图像:


那么如何正确显示此HTML(粗体、列表等)?

经验法则如下:

  • 在数据库中存储原始HTML,而不进行任何编码或清理。SQL server不关心是否存储了包含XSS代码的字符串
  • 将此输出显示到页面时,请确保已对其进行消毒
  • 因此:

    然后在显示时:

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

    请注意,我是如何在这里使用Html.Raw帮助程序来确保不会获得双重Html编码的输出的。
    htmlity.SanitizeHtml
    函数应该已经负责对值进行消毒,并返回一个可以在视图中显示的安全字符串,并且不会对其进行进一步编码。另一方面,如果您使用
    @htmlity.SanitizeHtml(Model.Data)
    ,那么
    @
    razor函数将对
    SanitizeHtml
    函数的结果进行HTML编码,该函数可能不是您想要的结果。

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

    您可以通过htmlcolumn的数据类型VARBINARY(MAX)将Html文件保存在数据库中

  • 将html文件转换为二进制文件()

  • 在类似以下示例代码的列中插入数据:

  • 在数据库上加载数据,当需要加载文件时,应通过以下代码将htmlcolumn转换为Nvarchar(max):
  • 如果这个解决方案有问题,谢谢你给我写评论


    我希望你一切顺利

    啊哈。。。清除:)所以在发布后,我基本上可以将其保存到数据库
    这是安全的文本,危险随后是scriptalert(“攻击”)/编写脚本

    ,只需在视图上使用SanitizeHtml即可。我认为我不能在数据库中保存html标记。我得到的这个值是通过模型从视图传递到Create方法的(它添加了&qt、lt等)。是的,您的理解是正确的。在数据库中存储原始HTML并没有什么问题。@DarinDimitrov如何获取
    htmlity.SanitizeHtml()
    方法。我不知道参考什么。我在谷歌上搜索了一下,发现
    htmlity
    仅适用于Windows和Windows Phone。如何在我的MVC Web项目中引用它?有关清理HTML(即删除不在白名单中的标记)的信息,请参阅
    <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>
    
    <p>Simple <em><strong>whitelist</strong> </em>test:</p>
    <ul>
    <li>t1</li>
    <li>t2</li>
    </ul>
    <p>Image:</p>
    <p>
    
    &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>
    
    [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))
    
    Declare @HTML   Varbinary(MAX) = Set HTML Varbinary code here 
    
    Insert into table_name (htmlcoulmn)
    Value @HTML
    
    Select CAST(htmlcolumn as nvarchar(MAX)) As HTMLCODE
    FROM Table_Name