【发布时间】:2014-02-09 18:00:06
【问题描述】:
这些天学习安全性:)
我需要允许用户在表单中输入文本并允许他们使用一些 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><img src="http://metro-portal.hr/img/repository/2010/06/medium/hijena_shutter.jpg" /></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)或者我需要将此结果编码,然后将其保存到数据库(编码如下)?
<p>Simple <em><strong>whitelist</strong> </em>test:</p>
<ul>
<li>t1</li>
<li>t2</li>
</ul>
<p>Image:</p>
<p>
如果我把它放在这样的视图上,我会感到困惑:
@Model.Data
我在视图上看到了这个:
<p>Simple <em><strong>whitelist</strong> </em>test:</p> <ul> <li>t1</li> <li>t2</li> </ul> <p>Image:</p> <p>
或
<p>Simple <em><strong>whitelist</strong> </em>test:</p> <ul> <li>t1</li> <li>t2</li> </ul> <p>Image:</p> <p>
那么如何正确显示此 HTML(粗体、列表等)?
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-4 razor xss