gpt4 book ai didi

asp.net-core - Blazor 清理 MarkupString

转载 作者:行者123 更新时间:2023-12-04 01:31:55 25 4
gpt4 key购买 nike

我正在尝试清理 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 引擎不知道如何渲染 MarkupStringSanitized .仅仅因为您输入了相同的 sanitizer 版本 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; }
    }

    额外的转换虽然是丑陋的 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; }
    }

    关于asp.net-core - Blazor 清理 MarkupString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60786935/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com