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.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文件保存在数据库中
我希望你一切顺利啊哈。。。清除:)所以在发布后,我基本上可以将其保存到数据库
这是安全的文本,危险随后是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>
<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>
[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