Blazor在属性中的未转义字符串



我目前正在研究Blazor(服务器(的XSS可能性和危险性。

通常,Blazor会对字符串进行自动输出编码。我已经读过了,这可以通过使用MarkupString类来避免。

这对于普通文本输出确实很有效,但如果变量在属性中,则不适用。如果这是我的模板

<div class="page @(myString)">
@(myString)
</div>
@code {
MarkupString myString = new MarkupString("" foo");
}

则渲染的输出变为

<div class="page &quot; foo">
" foo
</div>

MarkupString的第一次出现确实得到了编码,第二次没有。

有人能向我解释一下这种不同的行为吗?有没有办法防止第一种情况下的编码?

您在Razor文件中编写的关于布局的所有内容都将转换为对RenderTreeBuilder的调用。这个类有一个用于public void AddContent(int sequence, MarkupString markupContent)的方法和另一个用于public void AddContent(int sequence, object? textContent)的方法。不过,对于attribute,MarkupString类并没有专门的重载。因此,您体验到,当用作属性时会对同一变量进行编码,但当用作内容时不会进行编码。

作为参考,请查看该类https://github.com/dotnet/aspnetcore/blob/master/src/Components/Components/src/Rendering/RenderTreeBuilder.cs

从那里,它很快就进入了Blazor渲染的内脏。我不是这个领域的专家,但我没有找到任何方法来绕过属性值的默认HTML编码。

相关内容

  • 没有找到相关文章

最新更新