3

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

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>在表单中给出诸如 etc 之类的值,它似乎很好......文本的显示方式完全相同(<script>成为&lt;script&gt;。但这种转换似乎是由我使用的 javascript 插件完成的。

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

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

4

2 回答 2

3

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

  1. 如何在 ASP.NET 中清理来自 MCE 的输入?- 使用 Html Agility Pack 的白名单
  2. .NET HTML Sanitation 用于丰富的 HTML 输入- 使用 Html Agility Pack 的黑名单

接受 HTML 的替代方法是接受markdownBBCode。它们都被广泛使用(stackoverflow 使用了markdown!)并且消除了清理输入的需要。也有丰富的编辑器可用。

编辑

我发现 Microsoft Web 保护库可以通过 AntiXss.GetSafeHtml 和 AntiXss.GetSafeHtmlFragment 清理 HTML 输入。文档确实很差,而且您似乎无法配置哪些标签是有效的。

于 2013-11-02T03:47:57.537 回答
1

我在服务器端清理 wysihtml5 内容时遇到了同样的问题。我对 wysihtml5 如何执行客户端卫生并使用 Html Agility Pack 实现这一点相当着迷:Github 上的 HtmlRuleSanitizer 也可作为NuGet 包提供。

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

于 2015-06-29T14:26:59.987 回答