[英]How to build a custom AngleSharp element and insert/transform HTML sections into the element
[英]Inserting Custom Element with AngleSharp
我正在尝试更新一个使用基于 AngleSharp 的消毒剂来处理用户生成的 HTML 内容的站点。 站点用户需要能够嵌入 iframe,我正在尝试使用白名单来控制框架可以加载的域。 我想将“被阻止”的 iframe 重写为一个新的自定义元素“blocked-iframe”,然后该元素将被 sanitizer 删除,因此我们可以查看是否需要将其他域添加到白名单中。
我正在尝试使用基于此答案的解决方案: https://stackoverflow.com/a/55276825/794
它看起来像这样:
string BlockIFrames(string content)
{
var parser = new HtmlParser(new HtmlParserOptions { });
var doc = parser.Parse(content);
foreach (var element in doc.QuerySelectorAll("iframe"))
{
var src = element.GetAttribute("src");
if (string.IsNullOrEmpty(src) || !Settings.Sanitization.IFrameWhitelist.Any(wls => src.StartsWith(wls)))
{
var newElement = doc.CreateElement("blocked-iframe");
foreach (var attr in element.Attributes)
{
newElement.SetAttribute(attr.Name, attr.Value);
}
element.Insert(AdjacentPosition.BeforeBegin, newElement.OuterHtml);
element.Remove();
}
}
return doc.FirstElementChild.OuterHtml;
}
它表面上可行,但我注意到新元素标签中的尖括号在插入时被转义,因此结果只是作为文本写入页面。 我想我可以构建一个 map 替换,然后在发回之前对字符串执行它们,但我想知道是否有一种方法可以使用 AngleSharp 的 API。 该网站目前使用的是 0.9.9,考虑到其他一些正在使用的依赖项,我不确定我们能够更新多远。
在源代码中挖掘我在INode
中找到了ReplaceChild
方法,如果从element
的父级调用该方法则有效
string BlockIFrames(string content)
{
var parser = new HtmlParser(new HtmlParserOptions { });
var doc = parser.Parse(content);
foreach (var element in doc.QuerySelectorAll("iframe"))
{
var src = element.GetAttribute("src");
if (string.IsNullOrEmpty(src) ||
!Settings.Sanitization.IFrameWhitelist.Any(wls => src.StartsWith(wls)))
{
var newElement = doc.CreateElement("blocked-iframe");
foreach (var attr in element.Attributes)
{
newElement.SetAttribute(attr.Name, attr.Value);
}
element.Parent.ReplaceChild(newElement, element);
}
}
return doc.FirstElementChild.OuterHtml;
}
我会继续测试,但这对我来说似乎足够体面,如果有更好的方法我很想听。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.