仅允许某些HTML标记作为用户输入

时间:2013-11-01 20:52:04

标签: asp.net-mvc asp.net-mvc-5

我的网站允许网站用户撰写博客文章

class BlogPost  
{  
 [AllowHtml]  
 public string Content;  
}

该站点使用MVC5 Internet应用程序模板创建,并使用bootstrap 3作为其CSS。所以我决定使用http://jhollingworth.github.io/bootstrap-wysihtml5来处理富文本编辑器的所有JavaScript部分。

它就像一个魅力。但是为了使POST发生,我必须在上面的代码中添加[AllowHtml]属性。所以现在我害怕可以进入数据库并被反过来显示给所有用户的危险物品。

我尝试在表单中提供<script>alert("What's up?")</script>等值,但似乎没问题......文本的显示方式完全相同(<script>成为&lt;script&gt;。但是这种转换似乎是由我使用的javascript插件完成的。

所以我用fiddler编写了一个带有相同脚本标记的POST请求,这次,页面实际执行了JavaScript代码。

有什么方法可以找出像<script>甚至<a href="javascript:some_code">Link</a>这样的易受攻击的输入......?

2 个答案:

答案 0 :(得分:3)

不幸的是,您必须自己清理HTML。看看人们如何做到这些:

  1. How to sanitize input from MCE in ASP.NET? - 使用Html Agility Pack的白名单
  2. .NET HTML Sanitation for rich HTML Input - 使用Html Agility Pack的黑名单
  3. 接受HTML的另一种方法是接受markdownBBCode。它们都被广泛使用(markdown由stackoverflow使用!)并且消除了对输入进行清理的需要。还有很多编辑器。

    修改

    我发现Microsoft Web Protection Library可以清理HTML输入 通过AntiXss.GetSafeHtml和AntiXss.GetSafeHtmlFragment。 文档虽然很差,但似乎无法配置哪些标签有效。

答案 1 :(得分:1)

我遇到了同样的问题,在服务器端清理wysihtml5内容。我对wysihtml5如何执行客户端卫生并使用Html Agility Pack实现这一点感到非常着迷:HtmlRuleSanitizer on Github 也可以NuGet package

不使用Microsoft的AntiXss的原因是它无法强制执行更详细的规则,例如如何处理标记。这导致标签被完全删除,例如在保留文本内容时是有意义的。此外,我希望在所有内容(CSS,标签和属性)上都有白名单。