Blazor 清理 MarkupString

Blazor sanitize MarkupString

我正在尝试清理 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")

一些建议(不一定针对 OP,但针对其他希望解决问题的人):

  • 您没有提供执行实际清理的代码,所以我将说明(希望如此)明显的最佳实践,如果您遵循它,那就太好了。 不使用正则表达式(Regex)解析HTML
  • 此外,在这种情况下,Sanitize() 方法应遵循 immutability 的模式
  • 我建议使用以下库 Gans.XSS.HtmlSanitizer,它是一个活跃的库并定期更新。

问题

Razor View Engine 可能不知道如何呈现 MarkupStringSanitized。仅仅因为你鸭子输入了相同 struct 的净化版本并不意味着它可以渲染它。为了让它呈现,你需要将它转换成它知道的东西,MarkupString

这是我直接使用你的 HtmlSanitizedMarkup 而不进行任何修改时发生的情况。

@((MarkupStringSanitized)Content)

工作示例 #1

这是一个使用我的 Markdown -> Html 游乐场的示例(经过全面测试和工作):

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; }
}