簡體   English   中英

使用 AngleSharp 插入自定義元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM