我目前正在研究Blazor(服务器(的XSS可能性和危险性。
通常,Blazor会对字符串进行自动输出编码。我已经读过了,这可以通过使用MarkupString类来避免。
这对于普通文本输出确实很有效,但如果变量在属性中,则不适用。如果这是我的模板
<div class="page @(myString)">
@(myString)
</div>
@code {
MarkupString myString = new MarkupString("" foo");
}
则渲染的输出变为
<div class="page " 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编码。