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

Is it safe to render Html that was uploaded as Markdown and converted serverside to Html?

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

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

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

不,不是。

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

<a href="javascript:evil()">hello</a>

markdig让它通过:

参见online example

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

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

给出:

<a href="">hello</a>

但是

var safeHtml = Microsoft.Security.Application.Sanitizer
    .GetSafeHtmlFragment("<a href='http://whosebug.com'>hello</a>");

给出:

<a href="http://whosebug.com">hello</a>

一般要看markdown转换器。

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

参见示例:

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