渲染上传为 Markdown 并将服务器端转换为 Html 的 Html 是否安全?

Wil*_*ill 2 c# asp.net-mvc markdown html-encode

我有一个网络表单,允许用户将文本上传为 Markdown。

Markdown 在服务器上转换为 Html(使用 Markdig)并存储。

当显示用户上传的转换后的 Html 时,我是否应该对内容进行 @Html.Encode - 该项目在 c#、MVC 5/razor 中,并启用了请求验证。

bet*_*wse 8

一般来说,这取决于降价转换器。

默认情况下,Markdig不会转义 html。但是,您可以使用DisableHtml管道中的函数来转义所有剩余的未由以前的扩展处理的 HTML 可编码字符串。这也应该比让反 xss 函数再次运行字符串提供更好的性能。

参见示例:

var pipeline = new MarkdownPipelineBuilder().DisableHtml().Build();
var result = Markdig.Markdown.ToHtml("<a href='javascript:evil()'>hello</a>", pipeline);
Run Code Online (Sandbox Code Playgroud)


spe*_*der 5

不,不是。

我只是简单地测试了以下内容:

<a href="javascript:evil()">hello</a>
Run Code Online (Sandbox Code Playgroud)

markdig让它通过:

请参阅在线示例

虽然我没有深入研究它,但Microsoft AntiXSS 库在这里可能很有用:

var safeHtml = Microsoft.Security.Application.Sanitizer
    .GetSafeHtmlFragment("<a href='javascript:evil()'>hello</a>");
Run Code Online (Sandbox Code Playgroud)

给出:

<a href="">hello</a>
Run Code Online (Sandbox Code Playgroud)

var safeHtml = Microsoft.Security.Application.Sanitizer
    .GetSafeHtmlFragment("<a href='http://stackoverflow.com'>hello</a>");
Run Code Online (Sandbox Code Playgroud)

给出:

<a href="http://stackoverflow.com">hello</a>
Run Code Online (Sandbox Code Playgroud)

  • 对于阅读本文的其他人,最后我使用了 https://github.com/mganss/HtmlSanitizer (2认同)