React Native 呈现从draft-js保存的html

4uqofj5v  于 2022-12-14  发布在  React
关注(0)|答案(3)|浏览(172)

我正在学习React:完全是新手。
如果我直接从draft.js(或总是基于它的变体)将HTML保存在DB中,然后在React SPA的视图页面中,我通过API从DB中检索HTML:
问题:

owfi6suc

owfi6suc1#

Draft-JS不允许你直接从现有的EditorState生成HTML,这是一件好事。因为你不是在处理“原始HTML”,所以你不必处理XSS攻击,因为如果有人在编辑器中插入脚本,Draft Editor的内部状态不会被改变。
Draft JS允许您导出当前的编辑器状态,以便您可以轻松地存储它。可以使用

import {convertToRaw} from 'draft-js';

onChange处理程序中,您只需执行以下操作

const editorJSON = JSON.stringify(convertToRaw(editorState.getCurrentContent()));

您可以根据需要存储此JSON以供将来使用。
现在,对于渲染,您有两个选项:
1.从存储的EditorState生成HTML。
这可以使用像https://www.npmjs.com/package/draft-js-export-html这样的库来完成。您可能想要避免这种情况,因为在我看来,下一个选择要好得多。
1.将此EditorState用作只读DraftJS编辑器组件的默认值。
您将需要DraftJS库中的convertFromRaw,然后创建一个Nice Stateless React组件,如下所示

import React from 'react';
 import {Editor, ConvertFromRaw} from 'draft-js';

 const ReadOnlyEditor = (props) => {
   const storedState =  ConvertFromRaw(JSON.parse(props.storedState));
   return (
      <div className="readonly-editor">
        <Editor editorState={storedState} readOnly={true} /> 
      </div>
   );
 }

现在你可以简单地使用它来显示你的内容。你也可以传递你的装饰器和自定义Map函数,通常是你传递给普通编辑器的所有东西,并且可以呈现内容而不损失风格和繁琐的HTML处理。

fafcakar

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

a64a0gku

a64a0gku3#

在2022年对我来说,它的运作方式有点不同

import { convertFromRaw, Editor, EditorState } from 'draft-js';

function Comments() {
const itemText= EditorState.createWithContent(convertFromRaw(JSON.parse(item.content)));

return <Editor editorState={itemText} readOnly={true} />

}

数据库的保存方式

JSON.stringify(convertToRaw(editorState.getCurrentContent()))

不同之处在于,对于我来说,如果没有EditorState,它就无法工作,我相信我并不是唯一一个这样做人

相关问题