我正在学习React:完全是新手。
如果我直接从draft.js(或总是基于它的变体)将HTML保存在DB中,然后在React SPA的视图页面中,我通过API从DB中检索HTML:
问题:
- 如何呈现HTML?
- dangerouslySetInnerHTML?或者也许是这样的一个(你有什么建议?)?
- https://github.com/wrakky/react-html-parser
- https://github.com/pveyes/htmr
- https://github.com/remarkablemark/html-react-parser
- https://github.com/utatti/react-render-html
- https://github.com/aknuds1/html-to-react
- 我读过像“消毒”,“保护HTML”这样的词。但是怎么,有一个库?
- 当我将html保存在DB中或之后渲染它时,我需要保护draft-js中的html?
3条答案
按热度按时间owfi6suc1#
Draft-JS不允许你直接从现有的
EditorState
生成HTML,这是一件好事。因为你不是在处理“原始HTML”,所以你不必处理XSS攻击,因为如果有人在编辑器中插入脚本,Draft Editor的内部状态不会被改变。Draft JS允许您导出当前的编辑器状态,以便您可以轻松地存储它。可以使用
在
onChange
处理程序中,您只需执行以下操作您可以根据需要存储此JSON以供将来使用。
现在,对于渲染,您有两个选项:
1.从存储的EditorState生成HTML。
这可以使用像https://www.npmjs.com/package/draft-js-export-html这样的库来完成。您可能想要避免这种情况,因为在我看来,下一个选择要好得多。
1.将此EditorState用作只读DraftJS编辑器组件的默认值。
您将需要DraftJS库中的
convertFromRaw
,然后创建一个Nice Stateless React组件,如下所示现在你可以简单地使用它来显示你的内容。你也可以传递你的装饰器和自定义Map函数,通常是你传递给普通编辑器的所有东西,并且可以呈现内容而不损失风格和繁琐的HTML处理。
fafcakar2#
不要相信用户!
你应该关心的第一件事是“不要相信你的用户”。
如果您的'HTML'是由您的服务器呈现的,并且不能被用户修改,这是完全可以的。因为您呈现/保存的HTML是完全安全的,并且由您自己管理,并且如果它是“安全的”HTML,那么您是否将它(html)放入DOM中根本不是问题。
但问题是,大多数WYSIWYG编辑器--比如
draft.js
--生成的“HTML”文件不是TEXT。是的,这是危险的。我们所能做的不是直接呈现HTML,而是“选择性”呈现HTML。
危险标签:
<script>
、<img>
、<link>
等等。您可以删除这些标记,但在您决定允许哪些标记时会安全得多,如下所示:
安全标签:
<H1> - <H6>
/span
/div
/p
/ol
/ul
/li
/table
...而且您应该删除这些HTML元素属性,如
onclick=""
等。因为它也可能被用户滥用。
结论:
那么,当我们使用WYSIWYG编辑器时,我们可以做什么呢?
有两大战略:
1.在对数据库安全时生成“安全”HTML。
1.在将HTML放入DOM之前生成“安全”的HTML。(3.在将HTML发送到客户端之前生成“安全”的HTML,但这不是你的情况!)
选择第一个,如果你想确保数据库的文本是完全安全的.
第一个必须在你的服务器中处理(而不是浏览器/客户端!),你可以使用很多解决方案,比如python中的
BeautifulSoup
,或者nodejs中的sanitize-html
。如果您的Web应用程序比较复杂,并且您的服务的大部分业务逻辑都在前端运行,请选择第二个。
第二个是在将HTML装入DOM之前使用HTML转义包。
sanitize-html
仍然是一个很好的解决方案。(当然还有更多更好的解决方案!)你可以决定HTML中的标签/属性/值。链接
https://github.com/punkave/sanitize-html
a64a0gku3#
在2022年对我来说,它的运作方式有点不同
数据库的保存方式
不同之处在于,对于我来说,如果没有EditorState,它就无法工作,我相信我并不是唯一一个这样做人