一些建议(不一定适合OP,但适合其他想要解决问题的人):
- 您没有提供进行实际清理的代码,因此我将说明(希望如此)明显的最佳实践,如果您遵循它,那就太好了。不要使用正则表达式(Regex)来解析 HTML
- 另外,
Sanitize()
方法应遵循以下模式immutability
在这种情况下
- 我建议使用以下库Gans.XSS.HtmlSanitizer这是一个活跃的库并定期更新。
问题
Razor View Engine 不知道如何渲染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; }
}
但在我看来,这种额外的转换是丑陋的。 (也许比我聪明的人可以清理掉它?)
工作示例#2
在这里我尝试扩展MarkupString
使用扩展方法。看起来好一点,但也只是little.
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; }
}