Blazor 属性中的未转义字符串

Unescaped string in attributes by Blazor

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

通常情况下,Blazor 会自动对字符串进行输出编码。我have read that, this can be avoided by using the MarkupStringclass.

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

<div class="page @(myString)">
@(myString)
</div>

@code {
   MarkupString myString = new MarkupString("\" foo");
}

然后渲染输出变成

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

第一次出现的 MarkupString 会被编码,第二次不会。

有人可以向我解释这种不同的行为吗?在第一种情况下有什么方法可以防止编码吗?

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

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

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