9

我知道在 SO 中出现了很多关于 HTML sanitizers 的问题,但我不知道它们是否符合我的要求,我有点乱,因为一些推荐的方法已经有 4 年以上的历史了。

我有一个带有 TinyMCE 编辑器的页面。当然,这个编辑器将 HTML 发送到服务器,并期望 HTML,所以我创建了一个实体,其String属性装饰有该[AllowHtml]属性。它运作良好。

现在,我想确保没有人试图发送一个<script>标签,或者一个<img onerror="">,或者任何执行 JS 的方式,或者添加指向外部 url 的 CSS。

目前最好的解决方案是什么?

WPL有 HtmlSanitizationLibrary,但我怎么知道哪些标签被认为是“安全的”?

WPL 从去年 4 月起还没有发布任何东西,而且是测试版。所以我想知道这个项目是否活跃?

干杯。

4

3 回答 3

4

AntiXss/WPL 现在是“生命终结”。在其他地方的回复中找到了这个库:

HtmlSanitizer,一个 .NET 库,用于从可能导致 XSS 攻击的构造中清除 HTML 片段。

项目站点:https ://github.com/mganss/HtmlSanitizer

于 2016-02-10T13:46:11.003 回答
3

WPL是事实上的标准。通过它运行字符串,您可以安全地以未编码的方式打印它:

@Html.Raw(Model.SomePropertyThatWasSanitizedWithWPL)
于 2011-12-29T13:31:56.327 回答
1

你可能应该选择一个基于白名单的 HTML sanitizer,它实际上可以理解 HTML 文档。使用正则表达式通常不被认为是一种安全的方法。

不使用 Microsoft 的 AntiXss 的原因是无法强制执行更详细的规则,例如如何处理标签。例如,当保留文本内容有意义时,这会导致标签被完全删除。此外,它似乎不再被维护。

HtmlRuleSanitizer允许您定义一个清理策略,以完全匹配您的编辑器生成的预期 HTML,方式如下:

var sanitizer = new HtmlSanitizer();
sanitizer.Tag("strong").RemoveEmpty();
sanitizer.Tag("b").Rename("strong").RemoveEmpty();
sanitizer.Tag("i").RemoveEmpty();
sanitizer.Tag("a").SetAttribute("target", "_blank")
    .SetAttribute("rel", "nofollow")
    .CheckAttribute("href", HtmlSanitizerCheckType.Url)
    .RemoveEmpty();

string cleanHtml = sanitizer.Sanitize(dirtyHtml);

使用预定义的卫生策略。

于 2016-08-08T13:26:26.373 回答