【问题标题】:Database for Content - OK to store HTML?内容数据库 - 可以存储 HTML?
【发布时间】:2013-01-14 09:11:16
【问题描述】:

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

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

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

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

最好的方法是什么?谢谢!

【问题讨论】:

  • 问题不清楚。当然,可以将 html(或任何标记或语言)存储在数据库中。也可以使用 PHP 进行处理。您必须确保对内容进行转义,以便a)您的代码不对sql注入开放,b)无论内容值如何,语句都是有效的。最好是为此使用准备好的语句,看看 PDO。
  • 我很抱歉。问题基本上是,如果我只允许自己成为唯一通过 phpMyAdmin 编辑信息的人,那么将原始 html 存储在数据库中是安全的。

标签: php html database security


【解决方案1】:

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

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

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

【讨论】:

  • 如果我是唯一能够通过 phpMyAdmin 编辑和添加到数据库的人,我是否需要使用 markdown 之类的东西?如果有人有我的信息,他们可以自己进入 phpMyAdmin 并添加不安全的代码,我还有其他问题吗?我永远不会添加管理部分,我几乎总是会通过 phpMyAdmin 进行查询。当我阅读信息时,该用户将只有只读权限。
  • 确实如此,但无论如何我仍然建议使用 Markdown,因为它更像普通文本,并且不会限制您仅使用 HTML。它更容易编写,在数据库中占用的空间更少,完全安全,并且在 HTML 更新时不需要更改。
  • 好吧,我主要会使用 p、ul、ol、li 和 a 之类的标签。我不会太喜欢它,因为这些只是我将要处理的简短描述。其中 90% 根本没有任何 HTML。我是否需要花费相当多的时间来使用 markdown 来实现它们?这是否消除了有人删除我的降价代码并用 HTML 标记替换它的可能性,还是 HTML 也被解析了?我不是在这里建立一个庞大的系统。在整个数据库中我最多可能有 300 个条目,而不是像论坛这样的数千个条目或 HTML 的 10 或 20 个条目。
  • 我使用的 Markdown 版本是这样工作的:echo Markdown($textFromDB),它以 (X)HTML 的形式出现。使用它所需要做的就是include 'Markdown.php'。 Markdown 语法也非常容易学习,并且(正如我之前提到的)看起来更像是常规文本而不是标记语言。
【解决方案2】:

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

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

【讨论】:

  • 这就是我正在做的。我没有使用内容创建静态 HTML 页面,而是构建了一个模板系统并从数据库中提取信息。但问题是,一些教程和内容需要有所需的资源,而另一些则不需要。所以我需要在描述中添加 HTML 锚标记,比如下载这个文件。因此,当某些教程需要其他教程不需要的东西时,我无法真正创建模板系统。我希望这是有道理的。
【解决方案3】:

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

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

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

【讨论】:

  • 所以如果我只允许自己通过phpMyAdmin添加新条目,应该没问题吧?我的意思是,如果有人将我的帐户信息获取到他们可以进入 phpMyAdmin 的位置,那么我无论如何都会被冲洗,对吗?
  • 是的。 (如果您认为自己是值得信赖的来源。)
  • 能否请您说出一些我可以合并到我的网站中的不错的 Markdown 编辑器?
【解决方案4】:

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

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

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

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

【讨论】:

  • “thbb”是什么意思?
  • 啊,我还以为是某事的缩写。
  • 你的观点很好,我用 no 代替了 thbbb(你将舌头放在嘴唇之间吹气时发出的声音)。
【解决方案5】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2017-05-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多