Sanitizer.GetSafeHtmlFragment应该删除<br>元素吗?



MS的AntiXSS(v4.2.1)Sanitizer.GetSafeHtmlFragment(string)方法正在从我的输入中删除<br><br />标记。这应该发生吗?有办法绕过它吗?

它似乎也删除了nr字符,所以在消毒剂完成工作后,我无法调用Replace()

4.2.x版本的动机是在HTML清理程序中检测到一个安全漏洞。关于这个事实的更多信息:

  • Microsoft安全公告MS12-007-重要信息
  • Microsoft反XSS库旁路(MS12-007)

然而,似乎除了修复漏洞外,消毒液的攻击性更强,几乎无法使用。据报道,WPL CodePlex站点中存在有关此事实的问题(GetSafeHtmlFragment替换了所有html标记)。

如果你的问题只是<br>标签,并且你想坚持使用AntiXSS消毒液,那么你可以实现一个丑陋的解决方案,即对你的输入进行预处理,然后对消毒液的结果进行后处理。

类似的东西(代码仅用于说明目的):

static void Main(string[] args)
{
    string input = "<br>Hello<br/>World!";
    input = EscapeHtmlBr(input);
    var result = Sanitizer.GetSafeHtmlFragment(input);
    result = UnescapeHtmlBr(result);
    Console.WriteLine(result);
}
const string BrMarker = @"|br|";
private static string UnescapeHtmlBr(string result)
{
    result = result.Replace(BrMarker, "<br />");
    return result;
}
private static string EscapeHtmlBr(string input)
{
    input = input.Replace("<br>", BrMarker);
    input = input.Replace("<br />", BrMarker);
    input = input.Replace("<br/>", BrMarker);
    return input;
}

最新更新