内容数据库 - 存储HTML是否可行?

22

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

我有一个非常简单的问题。我提供视频教程和其他内容。如果不花费几个月编写正确的BBCode解析器,我需要将HTML存储起来,这样当我从数据库中获取它时,它看起来恰好符合我的要求。

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

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

如何最好地做到这一点?谢谢!


问题不清楚。当然可以将HTML(或任何标记或语言)存储在数据库中。同时,使用PHP处理也是可能的。您需要确保转义内容,以便a)您的代码不会受到SQL注入的影响,并且b)无论内容值如何,语句都是有效的。最好使用准备好的语句来实现这一点,请查看PDO。 - arkascha
抱歉。问题的实质是,如果我仅允许自己通过phpMyAdmin编辑信息,那么在数据库中存储原始HTML是否安全。 - Ethosik
5个回答

11

像其他人指出的那样,将HTML存储在数据库中并不危险。但是当你显示它时,你需要知道HTML是安全的。既然只有你编辑HTML,我认为没有问题。

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

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


如果只有我能通过phpMyAdmin编辑和添加数据库,那么我需要使用类似markdown的东西吗?如果有人拥有我的信息,他们可以自己进入phpMyAdmin并添加不安全的代码,那么我就有其他问题了,对吧?我永远不会添加管理员部分,我几乎总是通过查询在phpMyAdmin中执行。当我阅读信息时,该用户只能以只读方式进行访问。 - Ethosik
没错,但无论如何我仍然建议使用Markdown,因为它更像普通文本,不限于HTML。它更容易编写,在数据库中占用的空间更少,完全安全,并且不需要在HTML更新时进行更改。 - powerbuoy
我主要会使用像p、ul、ol、li和a这样的标签。我不会过于花哨,因为这些只是我要处理的简短描述。其中90%都没有任何HTML。我需要花费很多时间来实现它们吗?这是否消除了有人删除我的Markdown代码并替换为HTML标记的可能性,或者HTML也会被解析?我在这里没有构建一个大型系统。最多我可能会在整个数据库中有300个条目,而不是像论坛或带有10或20个HTML的东西那样有数千个。 - Ethosik
我使用的Markdown版本是这样工作的:echo Markdown($textFromDB),它输出为(X)HTML格式。你只需要做的就是 include 'Markdown.php' 来使用它。同时,Markdown语法也非常容易学习,(正如我之前提到的) 它看起来更像普通文本而不是标记语言。 - powerbuoy

5
存储HTML代码是可以的。但是,如果不是来自可信源,则需要检查它并仅允许使用安全的标记子集。HTML Tidy库可以帮助您实现这一点。
此外,您需要考虑到网站设计的未来变化,因此不要使用过多的标记,只使用基本标记。为了使其看起来符合您的需求,请在标记中使用全局CSS规则和语义命名的类。
但更好的方法是使用Markdown或另一种类似于Wiki的语法。有很棒的支持Markdown的JS编辑器,有实时预览功能(就像Stackowerflow这里的一个),您可以完全避免使用HTML。

那么,如果我只允许自己通过phpMyAdmin添加新条目,这样就可以了吗?我的意思是,如果有人获取了我的帐户信息并能够进入phpMyAdmin,那我就完了,对吧? - Ethosik
是的。(如果您认为自己是可信赖的来源。) - Josef Kufner
请问您能否推荐一些不错的Markdown编辑器,以便我可以将其集成到我的网站中? - Ollie Williams

5

从安全角度考虑,只要您是HTML的唯一作者,将HTML存储在数据库中并不比将其存储在其他地方不安全。但是,如果其他人可以在您的网站上编写HTML,则无论您将其存储在何处都无关紧要——重要的是您如何对其进行净化以及如何在哪里展示它。

现在,无论是否有效地存储HTML都是完全不同的问题。如果我是您,我会使用一些体面的模板系统,并将HTML存储在文件中。


这就是我正在做的事情。我正在构建一个模板系统,从数据库中提取信息,而不是创建静态HTML页面。但问题在于,有些教程和内容需要必要的资源,而其他则不需要。因此,我需要在描述中添加HTML锚标签,例如“下载此文件”。所以当一些教程需要某些东西而其他教程不需要时,我无法真正创建一个模板系统。希望这样说得清楚。 - Ethosik

3
我的初步答案是“不应该把HTML存储在数据库中”。如果你知道你存储的内容,并且能够确保安全,那么这样做也是可以的。但是,当你仅仅考虑这个问题时,你真的在遵循最佳实践吗?真正的答案是:“取决于情况”。
我知道像WordPress这样的东西会将HTML存储在数据库中,但作为专业的网站设计师,我喜欢遵循关注点分离的原则。将HTML存储在数据库中对于一个移动应用程序来说,有多可重用性?现在你的后端负责展示和数据,你是否有很多前端实现的可能性,或者你现在只能使用后端提供的界面,如果你想要不同的颜色并且你已经叠加了ul?这样的CSS样式有多容易处理?更改或更新HTML有多容易?
我可能错了,但即使Sitecore和Kentico这样的工具在某个地方存储HTML模板,与HTML模板相关的数据也是一个模型,而不是直接存储在HTML模板上。
所以,当你考虑这个问题时,你可能想将模型和模板分别存储,这样当你说“嘿,让我们建一个移动应用程序”时,你可以轻松地获取你的数据,而不是创建另一个表来存储相同的数据。

"thbb" 是什么意思? - CarenRose
啊,我一直以为那是某个缩写呢。 - CarenRose
你的观点很好,我用“不”代替了thbbb(当你把舌头放在嘴唇之间吹气时发出的声音)。 - Patrick Knott

0

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

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

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

Sqlite不适用于极大数据,因此您不应该使用它,并且缺少许多缓存功能。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接