ASP.NET Core Library – HtmlSanitizer

介绍

要输出 Raw HTML 最好是先消毒一下. 使用 Library 就可以了.

 

参考

Github – mganss / HtmlSanitizer

 

安装 nuget

dotnet add package HtmlSanitizer

 

调用

public static void Main()
{
    var sanitizer = new HtmlSanitizer();
    sanitizer.AllowedSchemes.Add("tel");
    var rawHtml = @"<a href=""tel:+60167737062"">Call Me</a>";
    var result = sanitizer.Sanitize(rawHtml);
    Console.WriteLine(result);
}

实例化, 然后调用 Sanitize 方法就可以了. 它会消除许多东西, 包括 tel.

所以有许多 by pass 和 whitelist 的方式. 我目前只用到上面这一个. 以后有再来补上.

Sanitize SVG

HtmlSanitizer 默认会把整个 <svg> 清除掉。

它不像 DOMPurify 那样支持消毒 <svg>。

作者给出了 solution 

相关讨论 Issue – Sanitizing SVG tag contents against XXS/XXE

whitelist 不好搞,我自己的做法是去抄 DOMPurify 的 tagsattribtues

希望够用吧...

唉,ASP.NET Core 生态就是差啊😔。

 

Razor HTML Encode

顺便聊一下 Razor 的 HTML Encode

<h2 data-key="@("\"Hello\"")">@("\"Hello\"")</h2>

上面这句会变成下面这个

attribute 的部分对 quote 做了 encode,innerHTML 的部分则没有 encode

再来一个

<h2 data-key="@("<Hello>")">@("<Hello>")</h2>

变成

相反,attribute 没有 encode,innerHTML 则 encode 了。

WebUtility.HtmlEncode

C# 有 build-in 的 encode 方法。

var v1 = WebUtility.HtmlEncode("<Hello>"); // &lt;Hello&gt;
var v2 = WebUtility.HtmlEncode("\"Hello\""); // &quot;Hello&quot;

quote 和 < 都会被 encode。

HTML Behaviour

for pure html,即使我们在 attribute 写上 encode 的代码,最终也会自动被 decode 掉哦

<h1 data-key="&lt;Hello&gt">Home page</h1>
<h1 data-key="<Hello>">Home page</h1>

最终出现

所以我们可以使用 WebUtility.HtmlEncode 在 attribute value 或 innerHTML 不用去区别它们。

 

posted @ 2022-07-18 14:24  兴杰  阅读(591)  评论(0)    收藏  举报