Blazor продезинфицировать MarkupString - PullRequest
1 голос
/ 21 марта 2020

Я пытаюсь очистить содержимое MarkupString. На самом деле я создал это (на основе https://github.com/dotnet/aspnetcore/blob/574be0d22c1678ed5f6db990aec78b4db587b267/src/Components/Components/src/MarkupString.cs)

public struct MarkupStringSanitized
{
    public MarkupStringSanitized(string value)
    {
        Value = value.Sanitize();
    }

    public string Value { get; }

    public static explicit operator MarkupStringSanitized(string value) => new MarkupStringSanitized(value);

    public override string ToString() => Value ?? string.Empty;
}

Но результат рендеринга не является необработанным html. Как мне реализовать MarkupStringSanitized для использования

@((MarkupStringSanitized)"Sanitize this content")

1 Ответ

1 голос
/ 21 марта 2020

Пара предложений (не обязательно для OP, но для всех, кто хочет решить проблему):

  • Вы не предоставили код, который выполняет фактическую очистку, поэтому я собираюсь изложить (надеюсь) очевидную лучшую практику и, если вы следуете ей, отлично. Не используйте регулярные выражения (Regex) для разбора HTML
  • Кроме того, метод Sanitize() должен соответствовать шаблону immutability в этом случае
  • I предложил бы следующую библиотеку Gans.XSS.HtmlSanitizer, которая является активной библиотекой и регулярно обновляется.

Проблема

Razor View Engine может не знать, как сделать MarkupStringSanitized. Тот факт, что вы набрали обеззараженную версию того же struct, не означает, что он может ее отрендерить. Чтобы сделать это для рендеринга, вам нужно привести его к чему-то, что он знает, MarkupString

Вот что происходит, когда я использовал ваш HtmlSanitizedMarkup напрямую без изменений.

@((MarkupStringSanitized)Content)

enter image description here

Рабочий пример # 1

Вот пример использования моей игровой площадки Markdown -> Html (полностью протестирован и работает):

enter image description here

MarkupStringSanitized.cs
public struct MarkupStringSanitized
{
    public MarkupStringSanitized(string value)
    {
        Value = Sanitize(value);
    }

    public string Value { get; }

    public static explicit operator MarkupStringSanitized(string value) => new MarkupStringSanitized(value);

    public static explicit operator MarkupString(MarkupStringSanitized value) => new MarkupString(value.Value);

    public override string ToString() => Value ?? string.Empty;

    private static string Sanitize(string value)  {
        var sanitizer = new HtmlSanitizer();
        return sanitizer.Sanitize(value);
    }
}
MarkupStringSanitizedComponent.razor
@if (Content == null)
{
    <span>Loading...</span>
}
else
{
    @((MarkupString)(MarkupStringSanitized)Content)
}

@code {
    [Parameter] public string Content { get; set; }
}

Это дополнительное преобразование, хотя и является уродливым ИМО. (может, кто-нибудь умнее меня сможет это исправить?)

Рабочий пример # 2

Здесь я попытался расширить MarkupString с помощью метода расширения. Это выглядит немного лучше, но только немного .

MarkupStringExtensions.cs
public static class MarkupStringExtensions
{
    public static MarkupString Sanitize(this MarkupString markupString)
    {
        return new MarkupString(SanitizeInput(markupString.Value));
    }

    private static string SanitizeInput(string value)
    {
        var sanitizer = new HtmlSanitizer();
        return sanitizer.Sanitize(value);
    }
}
MarkupStringSanitizedComponent.razor
@if (Content == null)
{
    <span>Loading...</span>
}
else
{
    @(((MarkupString)Content).Sanitize())
}

@code {
    [Parameter] public string Content { get; set; }
}
...