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 的 tags 和 attribtues。
希望够用吧...
唉,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>"); // <Hello> var v2 = WebUtility.HtmlEncode("\"Hello\""); // "Hello"
quote 和 < 都会被 encode。
HTML Behaviour
for pure html,即使我们在 attribute 写上 encode 的代码,最终也会自动被 decode 掉哦
<h1 data-key="<Hello>">Home page</h1> <h1 data-key="<Hello>">Home page</h1>
最终出现
所以我们可以使用 WebUtility.HtmlEncode 在 attribute value 或 innerHTML 不用去区别它们。