这些天学习安全:)
我需要允许用户在表单中输入文本并允许他们使用一些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><img src="http://metro-portal.hr/img/repository/2010/06/medium/hijena_shutter.jpg" /></p>
Becaouse的<p><
我认为我需要它首先解码:
<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(粗体,列表)等等)?
啊哈......清晰:)所以后门柱基本上我可以将此保存到数据库'
这是安全文本和危险如下> <脚本> alert('attack'); < /脚本>
'只是在视图上使用SanitizeHtml。我认为我不能在数据库中保存html标签。我得到的这个值是从视图到创建方法的模型(它增加了&qt,lt等)。 – 1110是的,你的理解是正确的。将原始HTML存储在数据库中没有任何问题。 –
谢谢Darin :) – 1110