我正在开发一个项目,允许公众(所以每个人)通过TinyMCE为自己的项目页面插入HTML。由于每个人都被允许使用此功能,我需要一种100%安全的方式将TinyMCE输出插入我的数据库,并将其显示在另一个页面上,就像用户插入一样。
XSS,SQL注入和其他所有垃圾都不是我想要的新网站!我可以做htmlentities - > htmlspecialchars以及稍后使用htmlentities_decode,但这是100%安全,这是最好的方法吗?
答案 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()
。