From 66b5f5741b3799abfc4f05789f244e65f15a4aef Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 11 Mar 2024 23:44:26 +0300 Subject: [PATCH] 20240311-1 --- anbs_cpfn/Classes/Sanitizer.cs | 341 +++++++++++++++++---------------- anbs_cpfn/anbs_cpfn.csproj | 2 +- 2 files changed, 172 insertions(+), 171 deletions(-) diff --git a/anbs_cpfn/Classes/Sanitizer.cs b/anbs_cpfn/Classes/Sanitizer.cs index 3344f61..b1e315d 100644 --- a/anbs_cpfn/Classes/Sanitizer.cs +++ b/anbs_cpfn/Classes/Sanitizer.cs @@ -1,207 +1,208 @@ using anbs_cp.ForNet.Enums; + using Ganss.Xss; namespace anbs_cp.ForNet.Classes; /// -/// Очистка текста от лишних HTML-тегов +/// Очистка текста от лишних HTML-тегов /// public static class Sanitizer { - #region Свойства + #region Свойства - /// - /// Все теги запрещены - /// - public static SanitizerAllowedHtml AllowedNone => GetNone(); + /// + /// Все теги запрещены + /// + public static SanitizerAllowedHtml AllowedNone => GetNone(); - /// - /// Все теги разрешены - /// - public static SanitizerAllowedHtml AllowedAll => GetAll(); + /// + /// Все теги разрешены + /// + public static SanitizerAllowedHtml AllowedAll => GetAll(); - /// - /// Оставлены только текстовые теги - /// - public static SanitizerAllowedHtml AllowedTextOnly => GetTextFormatOnly(); + /// + /// Оставлены только текстовые теги + /// + public static SanitizerAllowedHtml AllowedTextOnly => GetTextFormatOnly(); - /// - /// Оставлены только текстовые теги, а также img и a - /// - public static SanitizerAllowedHtml AllowedImageAndLinks => GetImageAndLinks(); + /// + /// Оставлены только текстовые теги, а также img и a + /// + public static SanitizerAllowedHtml AllowedImageAndLinks => GetImageAndLinks(); - /// - /// Применяются все теги, кроме iframe - /// - public static SanitizerAllowedHtml AllowedAllExceptIFrame => GetAllExceptIFrame(); + /// + /// Применяются все теги, кроме iframe + /// + public static SanitizerAllowedHtml AllowedAllExceptIFrame => GetAllExceptIFrame(); - #endregion + #endregion - #region Методы + #region Методы - /// - /// Очистка html-кода согласно параметрам - /// - /// HTML-код - /// Параметры очистки - /// Очищенный html-кода - private static string SanitizeHtml(string html, SanitizerAllowedHtml allowedHtml) + /// + /// Очистка html-кода согласно параметрам + /// + /// HTML-код + /// Параметры очистки + /// Очищенный html-кода + public static string SanitizeHtml (string html, SanitizerAllowedHtml allowedHtml) + { + // Создаю очиститель + HtmlSanitizer sanitizer = new() { - // Создаю очиститель - HtmlSanitizer sanitizer = new() - { - // - сохраняю дочерние удалённых - KeepChildNodes = true - }; + // - сохраняю дочерние удалённых + KeepChildNodes = true + }; - // Выключаю все параметры HTML - sanitizer.AllowedTags.Clear(); - sanitizer.AllowedSchemes.Clear(); - sanitizer.AllowedCssProperties.Clear(); - sanitizer.AllowedClasses.Clear(); - sanitizer.AllowedAttributes.Clear(); - sanitizer.AllowedAtRules.Clear(); - sanitizer.AllowDataAttributes = false; + // Выключаю все параметры HTML + sanitizer.AllowedTags.Clear(); + sanitizer.AllowedSchemes.Clear(); + sanitizer.AllowedCssProperties.Clear(); + sanitizer.AllowedClasses.Clear(); + sanitizer.AllowedAttributes.Clear(); + sanitizer.AllowedAtRules.Clear(); + sanitizer.AllowDataAttributes = false; - // Загружаю параметры - sanitizer.AllowedTags.UnionWith(allowedHtml.AllowedTags); - sanitizer.AllowedSchemes.UnionWith(allowedHtml.AllowedSchemes); - sanitizer.AllowedCssProperties.UnionWith(allowedHtml.AllowedCssProperties); - sanitizer.AllowedClasses.UnionWith(allowedHtml.AllowedClasses); - sanitizer.AllowedAttributes.UnionWith(allowedHtml.AllowedAttributes); - sanitizer.AllowDataAttributes = allowedHtml.AllowDataAttributes; + // Загружаю параметры + sanitizer.AllowedTags.UnionWith(allowedHtml.AllowedTags); + sanitizer.AllowedSchemes.UnionWith(allowedHtml.AllowedSchemes); + sanitizer.AllowedCssProperties.UnionWith(allowedHtml.AllowedCssProperties); + sanitizer.AllowedClasses.UnionWith(allowedHtml.AllowedClasses); + sanitizer.AllowedAttributes.UnionWith(allowedHtml.AllowedAttributes); + sanitizer.AllowDataAttributes = allowedHtml.AllowDataAttributes; - // Очищаю html согласно правилам - return sanitizer.Sanitize(html); - } + // Очищаю html согласно правилам + return sanitizer.Sanitize(html); + } - /// - /// Очистка html-кода по уровню очистки - /// - /// HTML-код - /// Уровень очистка - /// Очищенный html-код - public static string SanitizeHtml(string html, ESanitizerLevel level) + /// + /// Очистка html-кода по уровню очистки + /// + /// HTML-код + /// Уровень очистка + /// Очищенный html-код + public static string SanitizeHtml (string html, ESanitizerLevel level) + { + // Получаю параметры очистки + SanitizerAllowedHtml allowedHtml = level switch { - // Получаю параметры очистки - SanitizerAllowedHtml allowedHtml = level switch - { - ESanitizerLevel.NoTags => AllowedNone, - ESanitizerLevel.TextFormatOnly => AllowedTextOnly, - ESanitizerLevel.ImageAndLinks => AllowedImageAndLinks, - ESanitizerLevel.AllExceptIFrame => AllowedAllExceptIFrame, - ESanitizerLevel.All => AllowedAll, - var _ => AllowedAll - }; + ESanitizerLevel.NoTags => AllowedNone, + ESanitizerLevel.TextFormatOnly => AllowedTextOnly, + ESanitizerLevel.ImageAndLinks => AllowedImageAndLinks, + ESanitizerLevel.AllExceptIFrame => AllowedAllExceptIFrame, + ESanitizerLevel.All => AllowedAll, + var _ => AllowedAll + }; - // Очищаю код и возвращаю результат очистки - return SanitizeHtml(html, allowedHtml); - } + // Очищаю код и возвращаю результат очистки + return SanitizeHtml(html, allowedHtml); + } - #endregion + #endregion - #region Вспомогателдьные методы + #region Вспомогателдьные методы - /// - /// Получаю параметры, удаляющие все теги - /// - /// Параметры очистки - private static SanitizerAllowedHtml GetNone() => - new() - { - AllowedTags = [], - AllowedAttributes = [], - AllowedCssProperties = [], - AllowedClasses = [], - AllowedSchemes = [], - AllowDataAttributes = false - }; - - /// - /// Получаю параметры по умолчанию (разрешающие все теги) - /// - /// Параметры очистки - private static SanitizerAllowedHtml GetAll() + /// + /// Получаю параметры, удаляющие все теги + /// + /// Параметры очистки + private static SanitizerAllowedHtml GetNone () => + new() { - // Создаю очиститель - HtmlSanitizer sanitizer = new(); + AllowedTags = [], + AllowedAttributes = [], + AllowedCssProperties = [], + AllowedClasses = [], + AllowedSchemes = [], + AllowDataAttributes = false + }; - // Создаю модель - return new() - { - AllowedTags = sanitizer.AllowedTags.ToList(), - AllowedAttributes = sanitizer.AllowedAttributes.ToList(), - AllowedCssProperties = sanitizer.AllowedCssProperties.ToList(), - AllowedClasses = sanitizer.AllowedClasses.ToList(), - AllowedSchemes = sanitizer.AllowedSchemes.ToList(), - AllowDataAttributes = true - }; - } + /// + /// Получаю параметры по умолчанию (разрешающие все теги) + /// + /// Параметры очистки + private static SanitizerAllowedHtml GetAll () + { + // Создаю очиститель + HtmlSanitizer sanitizer = new(); - /// - /// Параметры, оставляющие только текстовые теги - /// - /// Параметры очистки - private static SanitizerAllowedHtml GetTextFormatOnly() => - new() - { - AllowedTags = - [ - "strong", "b", "em", "i", "u", "hr", "strike", "div", "ol", "ul", "li", "p", "span", "h1", "h2", "h3", - "h4" - ], - - // ReSharper disable StringLiteralTypo - AllowedAttributes = - [ - "align", "bgcolor", "border", "cellpadding", "cellspacing", "charset", "checked", "class", "clear", - "color", - "cols", "colspan", "datetime", "disabled", "headers", "height", "high", "hspace", "label", "lang", - "list", - "low", "max", "maxlength", "min", "name", "nowrap", "placeholder", "required", "rev", "rows", "rowspan", - "rules", "selected", "size", "span", "spellcheck", "style", "summary", "tabindex", "title", "type", - "valign", - "value", "vspace", "width", "wrap" - ] - // ReSharper restore StringLiteralTypo - }; - - /// - /// Параметры, оставляющие только текстовые теги, а также img и a - /// - /// Параметры очистки - private static SanitizerAllowedHtml GetImageAndLinks() + // Создаю модель + return new() { - // Получаю текстовые параметры - SanitizerAllowedHtml result = AllowedTextOnly; + AllowedTags = sanitizer.AllowedTags.ToList(), + AllowedAttributes = sanitizer.AllowedAttributes.ToList(), + AllowedCssProperties = sanitizer.AllowedCssProperties.ToList(), + AllowedClasses = sanitizer.AllowedClasses.ToList(), + AllowedSchemes = sanitizer.AllowedSchemes.ToList(), + AllowDataAttributes = true + }; + } - // Добавляю теги - result.AllowedTags.AddRange(["a", "img"]); - - // Добавляю параметры - // ReSharper disable StringLiteralTypo - result.AllowedAttributes.AddRange(["alt", "href", "hreflang", "nohref", "rel", "src", "target"]); - // ReSharper restore StringLiteralTypo - - // Возвращаю результат - return result; - } - - /// - /// Применяются все теги, кроме iframe - /// - /// Параметры очистки - private static SanitizerAllowedHtml GetAllExceptIFrame() + /// + /// Параметры, оставляющие только текстовые теги + /// + /// Параметры очистки + private static SanitizerAllowedHtml GetTextFormatOnly () => + new() { - // Получаю все параметры - SanitizerAllowedHtml result = AllowedAll; + AllowedTags = + [ + "strong", "b", "em", "i", "u", "hr", "strike", "div", "ol", "ul", "li", "p", "span", "h1", "h2", "h3", + "h4" + ], - // Удаляю iframe - result.AllowedTags.Remove("iframe"); + // ReSharper disable StringLiteralTypo + AllowedAttributes = + [ + "align", "bgcolor", "border", "cellpadding", "cellspacing", "charset", "checked", "class", "clear", + "color", + "cols", "colspan", "datetime", "disabled", "headers", "height", "high", "hspace", "label", "lang", + "list", + "low", "max", "maxlength", "min", "name", "nowrap", "placeholder", "required", "rev", "rows", "rowspan", + "rules", "selected", "size", "span", "spellcheck", "style", "summary", "tabindex", "title", "type", + "valign", + "value", "vspace", "width", "wrap" + ] + // ReSharper restore StringLiteralTypo + }; - // Возвращаю результат - return result; - } + /// + /// Параметры, оставляющие только текстовые теги, а также img и a + /// + /// Параметры очистки + private static SanitizerAllowedHtml GetImageAndLinks () + { + // Получаю текстовые параметры + SanitizerAllowedHtml result = AllowedTextOnly; - #endregion + // Добавляю теги + result.AllowedTags.AddRange(["a", "img"]); + + // Добавляю параметры + // ReSharper disable StringLiteralTypo + result.AllowedAttributes.AddRange(["alt", "href", "hreflang", "nohref", "rel", "src", "target"]); + // ReSharper restore StringLiteralTypo + + // Возвращаю результат + return result; + } + + /// + /// Применяются все теги, кроме iframe + /// + /// Параметры очистки + private static SanitizerAllowedHtml GetAllExceptIFrame () + { + // Получаю все параметры + SanitizerAllowedHtml result = AllowedAll; + + // Удаляю iframe + result.AllowedTags.Remove("iframe"); + + // Возвращаю результат + return result; + } + + #endregion } \ No newline at end of file diff --git a/anbs_cpfn/anbs_cpfn.csproj b/anbs_cpfn/anbs_cpfn.csproj index 7bfa656..bc00046 100644 --- a/anbs_cpfn/anbs_cpfn.csproj +++ b/anbs_cpfn/anbs_cpfn.csproj @@ -6,7 +6,7 @@ enable True ANBSoftware.ComponentsPackForNet - 2024.3.11.0 + 2024.3.11.1 Александр Бабаев Набор компонентов ANB Software для ASP.NET Core Библиотека полезных методов языка C# для ASP.NET Core