【问题标题】:Blazor sanitize MarkupStringBlazor 清理标记字符串
【发布时间】:2020-07-02 08:16:16
【问题描述】:

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

【问题讨论】:

  • “但渲染输出不是原始 html” – 你的意思是什么?
  • 我的意思是文本呈现为纯文本,不识别为htmli.stack.imgur.com/YAj3y.png

标签: asp.net-core struct blazor html-sanitizing


【解决方案1】:

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

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

问题

Razor 视图引擎不知道如何渲染 MarkupStringSanitized。仅仅因为您输入了相同struct 的净化版本并不意味着它可以呈现它。要让它渲染,你需要把它转换成它知道的东西,MarkupString

当我直接使用您的HtmlSanitizedMarkup 而不做任何修改时会发生以下情况。

@((MarkupStringSanitized)Content)

工作示例 #1

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

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

这种额外的转换虽然是丑陋的 IMO。 (也许比我聪明的人可以清理它?)

工作示例 #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; }
}

【讨论】:

  • 对了,我忘记描述sanitize的方法了,不过和你用gans antixss的方法是一样的。我喜欢这两种解决方案,我将使用工作示例 #2。谢谢
  • 我收到了另一个解决方案,将其放入组件中更符合 Blazor 的习惯。完成后我会更新答案,请回来查看!
  • 这真的很棒,非常感谢亚当
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 2022-01-06
  • 2010-11-17
相关资源
最近更新 更多