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; }
}
我正在尝试清理 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 游乐场的示例(经过全面测试和工作):
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
。看起来好一点,但只有一点.
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; }
}