【问题标题】:Storing formatted HTML text in database在数据库中存储格式化的 HTML 文本
【发布时间】:2015-04-25 03:26:33
【问题描述】:

我有兴趣让用户在我的网站上“分享”信息,说一些类似于公告板概念的内容。这是我以前从未做过的事情,因为我知道这可能会带来安全问题。

我可能会使用 ColdFusion 作为我的脚本语言。我也熟悉 PHP,但我倾向于 CF,因为它内置了 RichText 控件。数据库后端将是 MySql 或 SQLServer。

因此,我的问题归结为:具体的安全问题是什么?如何筛选用户输入? SQL存储的方法有什么限制吗(比如VARCHAR vs BLOB)?

【问题讨论】:

  • HTML 对于数据库引擎没有任何特殊意义。当然,风险在于,一旦您检索到它,无论您如何处理它。
  • 同意。我正在寻找一些“陷阱”的提示 - 一旦用户将他们的信息提交到服务器,我应该筛选一些具体的东西。我可能会实施一个验证码系统来防范机器人。

标签: mysql security web server-side-scripting


【解决方案1】:

我们实际上对网站的主要页面使用了 CMS,其核心是使用数据库与系统上的实际文件。因此,对于我们网站上的大部分内容,我们实际上都有从数据库中检索的 HTML。

例如

blurb.body 将等于 '<p>This is a body paragraph</p>'

然后我们似乎有时会遇到一个字符编码错误。似乎如果有人使用“'”或其他内容将某些文本复制到 CMS,则没有任何东西会自动将其转换为 '。

但是,是的,你应该能够做到。只需确保您在数据库中执行的任何过滤都在输出时正确反转。

【讨论】:

  • 您对安全性有什么建议吗?比如在向最终用户显示信息时防止跨站点脚本或其他引入恶意代码的尝试?
  • @MichaelBuckman 网页功能齐全且需要脚本吗?如果没有,请停用/删除所有脚本标签。
  • 您如何处理某人在其文本中包含 HTML 标签的情况(例如,在上面的答案中:“

    这是...”?您如何防止他们之间的混淆?有意在他们的答案的 TEXT 中包含标签,以及您自己的格式标签?您是否转义了他们的 HTML 实体?

  • 我的印象是 4 个核心 HTML 实体总是需要进行编码,以便区分用户输入的标签和真正的格式化标签。参见例如TinyMCE 中的强制编码:tinymce.com/wiki.php/Configuration:entity_encoding。在那个位置,它说:“......基本实体 & ' 和” 将始终是实体编码成它们的命名等价物。虽然 ' 和 " 只会在属性值中编码,而 只会在文本节点中编码。根据 HTML 和 XML 规范,这也是正确的......"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
相关资源
最近更新 更多