我如何安全地从 React 组件渲染 Markdown?

How do I SAFELY render Markdown from a React component?

我想在我的 ReactJS 应用程序中显示降价,但安全地完成它很重要。我将要显示的降价文件是不受信任的 public 内容。

我看过各种解决方案,它们都使用了 dangerouslySetInnerHTML。

我忍不住想这可能是,呃,危险。

有人有什么想法吗?

谢谢

They gave dangerouslySetInnerHTML a scary name very deliberately,以确保人们 非常 仔细考虑他们是否需要使用 it/whether 他们正在正确使用它。看到你问这个问题,显然它做得很好!但 Markdown 渲染实际上是一个必要的例子。

基本上,归根结底是:dangerouslySetInnerHTML 只有在您没有事先确保放入其中的东西是安全的情况下才是危险的。小心点,别被它吓跑了!

编辑: 正如 Waylan 在评论中提到的,我给出的示例非常幼稚,没有考虑 other ways XSS attacks can be achieved through Markdown。很可能你想要 运行 输出 通过消毒剂而不是 of/as 以及输入,否则很可能生成恶意 HTML 而不是像嵌入 script 标签那样简单。不过,我回答的要点是一样的; dangerouslySetInnerHTML 的危险程度取决于您放入其中的内容。做你的研究,确保输入是安全的,你会没事的。

如果输入不受信任(并且您对此无能为力),图书馆应在显示输入之前正确清理输入。

我发现两个库似乎可以做到这一点:

  • react-markdown

    只需确保 escapeHtml 选项设置为 true。要进行测试,请在 demo page 上将 "HTML mode" 设置为 "Escape"。

  • remarkable

    没测试过,安全性not"an explicitly stated goal of the project"。该信息来自 2014 年,因此可能已经更改(README 中没有信息)。 YMMV.