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

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

这些天学习安全:)
我需要允许用户在表单中输入文本并允许他们使用一些 HTML 标签:粗体、斜体、列表等,并防止他们添加一些危险的 JavaScript 代码。
所以我用了this whitelist implementation净化 HTML。
但我仍然对如何以正确的方式保存和显示它感到困惑。
所以我做了什么:
型号:

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

Controller :

[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;我认为我需要先解码它:

<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;

如果我像这样把它放在 View 上,我会很困惑:

@Model.Data

我在 View 中得到了这个:

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

最佳答案

经验法则如下:

  1. 将原始 HTML 存储在数据库中,无需任何编码或清理。 SQL 服务器并不关心您是否存储了包含 XSS 代码的字符串。
  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 函数应该已经负责清理该值并返回一个可以在 View 中显示的安全字符串,并且不会对其进行进一步编码。另一方面,如果您使用 @HtmlUtility.SanitizeHtml(Model.Data),则 @ razor 函数将对 SanitizeHtml 的结果进行 HTML 编码> 功能可能不是您正在寻找的功能。

关于asp.net-mvc - 如何将 HTML 保存到数据库并正确检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21662766/

相关文章:

asp.net-mvc - MVC 4 openauth - 自定义数据存储

asp.net - reCaptcha 验证超时异常

jquery - YouTube 视频和图像在同一个 ColorBox 中?

asp.net - 发布时出现 Dot Net Core 构建错误 - 目标标签名称不能为空或空格

html - MVC 连续排列元素

asp.net-mvc - 从我的自定义助手中访问 ModelState?

javascript - 将 Javascript 结果传递给 View

asp.net-mvc - ASP.NET MVC 2 : Breaking changes

c# - Controller 生成很少的线程,尽管没有被询问

asp.net-mvc - 我可以使用Visual Studio的快速版本制作ASP.NET MVC2应用程序吗?