19

基本问题是 - 如果我限制谁可以提交给它,将 HTML 存储在数据库中是否安全?

我有一个非常简单的问题。我提供视频教程和其他内容。无需花费数月时间编写适当的 BBCode 解析器,我就需要存储 HTML,以便在从数据库中获取它时让它看起来完全符合我的要求。

基本上,我计划将有关教程系列和每一集的所有信息存储在数据库中。我想对两者的描述进行一些格式化,这样我就可以添加多个段落、有序和无序列表、所需资源的链接等等。

我正在使用 PHP 并创建自己的数据库。我现在正在使用 phpMyAdmin 将信息存储在表中。当我在 PHP 代码中提取信息时,我将使用具有只读权限的用户。

做这个的最好方式是什么?谢谢!

4

5 回答 5

9

就像其他人指出的那样,在数据库中存储HTML 并没有什么危险。但是当您显示它时,您需要知道 HTML 是安全的。看到你是唯一一个编辑 HTML 的人,我认为没有问题。

但是,我根本不会存储 HTML。如果您只需要标题、段落、列表、链接、图像等,我会说 Markdown 非常适合。Markdown 的好处是它看起来就像普通文本(即您可以将您的文章作为电子邮件发送或将它们保存为 txt 文档),它占用的空间HTML 少得多,而且您不必更改它一旦 HTML 得到更新。

http://michelf.ca/projects/php-markdown/

于 2013-01-30T14:31:44.880 回答
5

存储 HTML 代码很好。但如果它不是来自受信任的来源,您需要检查它并只允许一个安全的标记子集。HTML Tidy 库将帮助您。

此外,您需要考虑网站设计的未来变化,所以不要使用太多标记,只使用基本标签。为了让它看起来像你想要的,在标记中使用全局 CSS 规则和语义命名的类。

但更好的是使用 Markdown 或其他类似 wiki 的语法。Markdown 有很好的 JS 编辑器,可以实时预览(就像 Stackowerflow 上的那个),你可以完全避免使用 HTML。

于 2013-01-30T14:15:40.327 回答
5

从安全的角度来看,将您的 HTML 存储在数据库中并不比将其存储在其他任何地方更安全 - 如果您是该 HTML 的唯一作者。但是话又说回来,如果其他人可以在您的网站中创作 HTML,那么您将它存储在哪里并不重要 - 只有您如何清理它以及如何以及在何处显示它。

现在它是否是一种有效的方式来存储 HTML 是完全不同的事情。如果我是你,我会使用一些不错的模板系统并将 HTML 存储在文件中。

于 2013-01-30T14:16:36.407 回答
3

我对“我应该将 html 存储在数据库中”的最初回答通常是否定的。当然,如果您知道自己要存储什么,那肯定是安全的,但是当您只问这个问题时,您真的在考虑最佳实践吗?真正的答案是“视情况而定”。

我确信有像 Wordpress 这样将 html 存储在数据库中的东西,但是,作为一名专业的网站设计师,我喜欢记住关注点分离原则。在移动应用程序的数据库中存储 html 的可重用性如何?您的后端现在负责显示和数据吗?您是否有许多前端实现的可能性,或者您现在是否坚持后端描绘的任何内容,如果您希望它具有不同的颜色并且您在 ul 中堆叠 ul 中的 ul 怎么办?现在的 css 样式有多容易?更改或更新该 html 有多容易?

我可能是错的,但即使是 Sitecore 和 Kentico 也可能将 html 模板存储在数据库中的某个地方,但与该 html 模板关联的数据是一个模型,而不是直接在 html 模板上。

因此,当您考虑这个问题时,您可能希望将模型存储在一个地方,将模板存储在另一个地方,这样当您说“嘿,让我们构建一个移动应用程序”时,您可以获取数据并继续,而不是创建另一个表来存储相同的数据。

于 2020-05-11T15:57:13.167 回答
0

将文本数据存储在 Mongodb gridFS +压缩中并使用 mongodump 进行日常备份,我犯了一个非常大的错误。GridFS 是 1GB 的文本文件,但由于备份的制作方式,备份内存使用量有时会在一个月后每天增加 1GB 20GB 内存。

在 mongodb 中,您应该对数据文件夹进行快照 - 而不是 mongodump。可能的原因是它将未使用的数据从磁盘复制到内存中,然后进行 bson 转储。因此,就我而言,长时间未使用的文本永远不应加载到内存中。我认为这就是备份的工作方式,因为即使现在我的 Mongodb 在运行 mongodump 后使用 200MB 的内存,它可以上升到 3GB

所以我认为最好的解决方案是使用文件系统来存储 HTML 文件,因为您的 RAID (如 PERC H700)具有许多惊人的缓存功能,包括预读。但它有一些限制,比如网络访问,根据我的经验,一些数据及时损坏,需要运行 chkdsk 进行修复,因为每天添加或删除许多 GB 数据。此外,您还应该考虑使用适当的 RAID 功能,例如写入槽,以防止电源故障时数据丢失。

Sqlite 不是为处理超大数据而设计的,因此您不应该使用它,并且缺少许多缓存功能。

不完美的解决方案是在 nodejs 中使用 MariaDB 或它自己的缓存脚本,可以使用 memcached/Linux ramdisk 和可能 1GB 的热缓存。一段时间后使用内部 nodejs 缓存机制会产生很多内存泄漏。所以我可以将它用于网络连接,并且 I/O 正在使用文件系统锁定,并且许多“HOT”最常用的文件可以被编程为缓存在 RAM 中或保持原样

于 2020-04-12T09:52:18.243 回答