【问题标题】:How to extend Html.Raw in order to Sanitize dangerous HTML data before displaying如何扩展 Html.Raw 以便在显示之前清理危险的 HTML 数据
【发布时间】:2016-03-03 10:02:12
【问题描述】:

我继承了一个 web 应用程序,它已经有一些输入字段接受来自用户的纯 Html。 (你可能明白 XSS(跨站脚本)的钟声在这里响起......!)

使用@Html.Raw 在特定视图页面上显示相同的输入(...现在铃声响亮了)

而且,为了能够完成这项工作,Controller 上的 [ValidateInput(false)] 装饰器和 Model 字段上的 [AllowHtml] 来填充图片...... (我能说什么钟声!!!)

现在,在有人将某些程序员定罪之前 :-) 让我明确一点,这种危险的输入功能是允许特定管理员角色的用户使用的。所以这是一种可控的情况。

不过,最近我们决定添加一些控制来解决这种情况,因为此功能会从内部产生风险,以防管理员用户本人的恶意行为。

易于实施的选项是禁用整个功能并添加一些 Markdown 编辑器,它将存储无害的富文本格式输入,但我仍然必须转换所有 现有数据到此 Markdown,以便它们正确显示。

不过,我需要的是能够降低内部风险 - 不是消除 - 通过添加某种过滤器脚本标签和其他危险标签,作为现有 Html.Raw 助手的扩展。

谁能建议一种方法来扩展或包装现有的 HtmlHelper?

这是元数据信息:

// Summary:
//     Returns markup that is not HTML encoded.
//
// Parameters:
//   value:
//     The HTML markup.
//
// Returns:
//     The HTML markup without encoding.
public IHtmlString Raw(string value);

【问题讨论】:

    标签: c# asp.net-mvc xss html-helper razorengine


    【解决方案1】:

    使用 Microsoft AntiXSS 库可以避免跨站脚本攻击。安装AntiXSS 4.3.0。来自 nuget Install-Package AntiXSS

    @Html.Raw(Microsoft.Security.Application.Sanitizer.GetSafeHtmlFragment(value))
    

    如果这不起作用,请尝试使用 AjaxControlToolkit 的 HtmlAgilityPackSanitizerProvider。使用它您可以将一些标签和属性列入白名单。

    你可以查看这个SO link

    【讨论】:

    • 这看起来很完美,谢谢帕万!我现在正在测试结果。关于此的一个快速问题:我可以使用类似的东西来进行 INPUT 消毒吗?
    • @cnom 是的,你可以使用
    • 经过更彻底的调查后,我发现这个库杀死了很多现有的格式(即字体颜色、背景颜色等),这看起来有点奇怪......这就是为什么我还没有标记你的答案,我还在寻找更好的解决方案!
    • 你查了吗AjaxControlToolkit's HtmlAgilityPackSanitizerProvider
    • 这没有回答问题。他要求一种扩展 Html.Raw 的方法。这个答案要求他替换它的所有用途,这可能不是某些人的选择。
    猜你喜欢
    • 2021-07-07
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多