内容数据库 - 可以存储HTML吗?

时间:2013-01-30 14:07:33

标签: php html database security

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

我有一个非常简单的问题。我提供视频教程和其他内容。在没有花费数月时间编写适当的BBCode解析器的情况下,我需要存储HTML,这样当我从数据库中获取它时,我可以让它看起来就像我想要的那样。

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

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

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

5 个答案:

答案 0 :(得分:6)

正如其他人所指出的,在数据库中存储 HTML没有任何危险。但是当你显示它时,你需要知道HTML是安全的。看到你是唯一一个编辑HTML的人,我认为没问题。

但是,我根本不会存储HTML。如果你需要的只是标题,段落,列表,链接,图像等,我会说Markdown是完美的选择。 Markdown的好处是它看起来就像普通文本一样(即你可以将你的文章作为电子邮件发送或者将它们保存为txt文档),它比HTML 批次更少的空间>和一旦HTML更新,您就不必更改它。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:2)

我对“我应该在db中存储html”的最初回答通常是否。如果您知道要存储的内容,那肯定是安全的,但是仅问一个问题时,您是否真的在考虑最佳实践?真正的答案是“取决于”。

我敢肯定,像Wordpress这样的东西可以将html存储在数据库中,但是,作为专业的网站设计师,我喜欢记住“关注分离”原则。在移动应用程序数据库中存储html的可重用性如何?您的后端现在负责显示和数据吗?您是否有很多实现前端的可能性,或者您现在固定在后端描绘的内容上,如果您希望它使用不同的颜色并且将ul堆放在ul内,该怎么办? CSS样式现在有多容易?更改或更新该html有多容易?

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

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

答案 4 :(得分:0)

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

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

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

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

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