2013-11-01 89 views
3

我的网站允许网站用户写博客,帖子只允许某些HTML标签的用户输入

class BlogPost 
{ 
[AllowHtml] 
public string Content; 
} 

使用MVC5互联网应用模板创建网站,并使用自举3为它的CSS。所以我决定使用http://jhollingworth.github.io/bootstrap-wysihtml5来处理Rich Text Editor的所有JavaScript部分。

它就像一个魅力。但为了使POST发生,我必须像上面的代码那样添加[AllowHtml]属性。所以现在我害怕可以进入数据库的危险东西,并将其显示给所有用户。

我试着给喜欢<script>alert("What's up?")</script>等形式值,它似乎是罚款......文字中显示完全相同的方式(<script>成为&lt;script&gt;,但这个转换似乎被我所使用的JavaScript插件来完成。

所以我用小提琴手组成与相同的脚本标签,这一次POST请求,页面实际执行的JavaScript代码。

有什么办法,我可以找出脆弱的输入像<script>甚至<a href="javascript:some_code">Link</a>。 ..?

回答

3

不幸的是,你必须自己清理HTML。使用HTML敏捷性包

  • .NET HTML Sanitation for rich HTML Input白名单 - -

    1. How to sanitize input from MCE in ASP.NET?黑名单使用HTML敏捷性包

    在接受HTML的替代方法是接受markdownBBCode代替:看到这些人们是如何做的。它们都被广泛使用(markdown被stackoverflow使用!)并且消除了对输入进行消毒的需要。也有丰富的编辑。

    编辑

    我发现微软Web保护库可以通过AntiXss.GetSafeHtml和AntiXss.GetSafeHtmlFragment清理HTML输入 。 文档虽然很差,但似乎你不能配置哪些标签是有效的。

  • +2

    降价不需要HTML输入消毒是错误的。 Markdown允许任意的HTML。你仍然需要消毒。 –

    1

    我面临同样的问题,消毒服务器端的wysihtml5内容。我对wysihtml5如何执行客户端卫生以及如何使用Html Agility Pack执行此操作感到非常迷惑:HtmlRuleSanitizer on Github 也可用作NuGet package

    不使用微软AntiXss的原因是不可能执行更详细的规则,比如如何处理标签。这会导致标记被完全删除,例如,它可以保留文本内容。此外,我希望对所有内容(CSS,标签和属性)都有一个白名单方法。