在MySQL中存储html的100%安全方式

时间:2012-07-21 11:27:41

标签: php mysql html code-injection

我正在开发一个项目,允许公众(所以每个人)通过TinyMCE为自己的项目页面插入HTML。由于每个人都被允许使用此功能,我需要一种100%安全的方式将TinyMCE输出插入我的数据库,并将其显示在另一个页面上,就像用户插入一样。

XSS,SQL注入和其他所有垃圾都不是我想要的新网站!我可以做htmlentities - > htmlspecialchars以及稍后使用htmlentities_decode,但这是100%安全,这是最好的方法吗?

3 个答案:

答案 0 :(得分:6)

在大多数情况下,使用预准备语句可以轻松避免SQL注入。

如果您计划允许用户发布HTML标记,则XSS会更加困难。您需要删除所有<script>标记,标记中的所有on*属性,所有javascript:网址,即使这样,也可能无法完全保证输入HTML的安全性。有HTMLPurifier这样的库可以提供帮助,但只要你允许使用HTML,就有可能让恶意通过。

您可以使用实现markdown或wikitext等内容的库。这严重限制了用户可以输入的内容,同时仍然允许他们在一定程度上标记内容。它不是全面的(人们仍然可以发布到恶意网站的链接,并希望用户点击它们,有些人会真实地做到这一点),你将无法使用像TinyMCE这样的丰富编辑器而没有某种形式插件,但清理markdown比清理HTML要简单得多。

答案 1 :(得分:3)

这是不可行的。您认为要过滤以便这是一个好点,但最终如果您接受html,则无法将其完全锁定。看看bbcode,markdown等等,看一些替代品。

如果您决定接受HTML代码,那么它不仅仅是过滤需要完成的工作,甚至编码也会产生严重的安全问题。例如,搜索UTF-7以查看哪些问题。请参阅此处的一些示例:http://www.webappsec.org/projects/articles/091007.txt

答案 2 :(得分:-3)

存储和显示HTML是两回事。

对于存储 MySQL中的HTML,mysql_real_escape_string()就足够了,并且可以保护您免受SQL注入。

对于显示,取决于。您希望用户能够编写HTML,但您希望免受XSS攻击等的影响,因此您应该使用像HTMLPurifier这样的过滤器(这就是Stackoverflow所做的)。只需从数据库中检索HTML即可执行此操作。

您永远不需要使用htmlentities()htmlentities_decode()