在 MySQL 中存储 html 的 100% 安全方式 [关闭]
Posted
技术标签:
【中文标题】在 MySQL 中存储 html 的 100% 安全方式 [关闭]【英文标题】:100% safe way of storing html in MySQL [closed] 【发布时间】:2012-07-20 11:06:09 【问题描述】:我正在开展一个项目,允许公众(因此每个人)通过 TinyMCE 为他们自己的项目页面插入 html。由于每个人都可以使用此功能,因此我需要一种 100% 安全的方式将 TinyMCE 输出插入到我的数据库中,并在用户插入时将其显示在另一个页面上。
XSS、SQL 注入和所有其他垃圾都不是我想要的新网站!我可以做 htmlentities -> htmlspecialchars,然后再使用 htmlentities_decode,但这 100% 安全吗?这是最好的方法吗?
【问题讨论】:
允许用户编写原始 HTML 然后显示给其他用户实际上是在乞求利用。避免 SQL 注入是微不足道的;只需使用准备好的语句。在这种情况下避免 XSS 很棘手(不可能?)。 htmlpurifier.org - HTMLPurifier 我同意@OliCharlesworth 的观点,在你的情况下几乎不可能防止 XSS。 我认为最好是使用 PDO 并使用PDO::prepare
准备参数。无需逃避
【参考方案1】:
在大多数情况下,使用预准备语句可以轻松避免 SQL 注入。
如果您计划允许用户发布 HTML 标记,则 XSS 会更加困难。您需要删除所有<script>
标签、标签中的所有on*
属性、所有javascript:
url,即使这样,也不能完全保证输入HTML 安全。有诸如 HTMLPurifier 之类的库可以提供帮助,但只要您允许 HTML,您就有可能让恶意软件通过。
您可以改用实现诸如降价或维基文本之类的库。这严重限制了用户可以输入的内容,同时仍然允许他们在一定程度上标记内容。它不是万无一失的(人们仍然可以发布指向恶意网站的链接并希望用户点击它们,有些人会天真地做到这一点),并且如果没有某种功能,您将无法使用诸如 TinyMCE 之类的富编辑器插件,但是清理markdown比清理HTML要简单得多。
【讨论】:
【参考方案2】:这是不可行的。您认为过滤是一个好点,但如果您接受 html,最终将无法完全锁定它。查看 bbcode、markdown 等内容以了解一些替代方案。
如果您决定接受 HTML 代码,它不仅会过滤需要完成的工作,甚至编码也会产生严重的安全问题。以搜索 UTF-7 为例,看看有什么问题。在此处查看一些示例:http://www.webappsec.org/projects/articles/091007.txt
【讨论】:
确实可行,只需使用带有安全白名单的 HTML 过滤器即可。我有点惊讶,唯一赞成的答案并没有真正回答这个问题。 即使有白名单,也可以使用智能技巧生成标签。还要考虑编码等。即使是众所周知的 HTML 净化器,尽管类在极端情况下也存在安全问题。听起来不错,但很难认为它是安全的。由于可能的选项数量众多,因此应该涵盖很多非常多的极端案例。不可能监督所有选项,因此这是一个安全问题。【参考方案3】:存储和显示 HTML 是两件不同的事情。
对于在 mysql 中存储 HTML,mysql_real_escape_string()
就足够了,并且可以保护您免受 SQL 注入。
对于显示,这取决于。您希望用户能够编写 HTML,但又希望免受 XSS 攻击等攻击,因此您应该使用 HTMLPurifier 之类的过滤器(这就是 *** 所做的)。您只需在从数据库中检索 HTML 后执行此操作。
您永远不需要使用htmlentities()
或htmlentities_decode()
。
【讨论】:
所以你存储内容然后过滤?为什么不过滤然后存储.. 因为如果用户想稍后编辑他们的 HTML,您不希望他们向他们显示处理后的文本。您可以通过在 MySQL 中使用两列来规避这种情况,一列用于原始 HTML,另一列用于过滤后的 HTML。不过,我认为这超出了这个问题的范围。 “这就是 *** 所做的” - 但 *** 无论如何都不会呈现任意 HTML... @Artefact2,你是认真的吗?当然不是 @Artefact2:见meta.stackexchange.com/questions/1777/…。以上是关于在 MySQL 中存储 html 的 100% 安全方式 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PHP 和 MYSQL 在单个单元格数据库中插入/存储多个项目
Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储