我正在开发一个项目,允许公众(所以每个人)通过 TinyMCE 为他们自己的项目页面插入 HTML。由于每个人都可以使用此功能,因此我需要一种 100% 安全的方式将 TinyMCE 输出插入到我的数据库中,并在用户插入时将其显示在另一个页面上。
XSS、SQL 注入和所有其他垃圾都不是我想要的新网站!我可以做 htmlentities -> htmlspecialchars,然后再使用 htmlentities_decode,但这 100% 安全吗?这是最好的方法吗?
我正在开发一个项目,允许公众(所以每个人)通过 TinyMCE 为他们自己的项目页面插入 HTML。由于每个人都可以使用此功能,因此我需要一种 100% 安全的方式将 TinyMCE 输出插入到我的数据库中,并在用户插入时将其显示在另一个页面上。
XSS、SQL 注入和所有其他垃圾都不是我想要的新网站!我可以做 htmlentities -> htmlspecialchars,然后再使用 htmlentities_decode,但这 100% 安全吗?这是最好的方法吗?
在大多数情况下,使用准备好的语句很容易避免 SQL 注入。
如果您打算允许用户发布 HTML 标记,则 XSS 会更加困难。您需要删除所有<script>
标签、标签中的所有on*
属性、所有javascript:
url,即使这样也不能完全保证输入 HTML 安全。有诸如HTMLPurifier之类的库可以提供帮助,但只要您允许 HTML,您就有可能让恶意软件通过。
您可以使用实现诸如降价或 wikitext 之类的库。这严重限制了用户可以输入的内容,同时仍然让他们在一定程度上标记内容。它不是万无一失的(人们仍然可以发布指向恶意网站的链接并希望用户点击它们,有些人会天真地实际这样做),如果没有某种类型,您将无法使用诸如 TinyMCE 之类的富编辑器插件,但是清理markdown比清理HTML要简单得多。
这是不可行的。您认为过滤是一个好点,但如果您接受 html,最终将无法完全锁定它。查看 bbcode、markdown 等内容以查看一些替代方案。
如果您决定接受 HTML 代码,它不仅会过滤需要完成的工作,甚至编码也会产生严重的安全问题。以搜索 UTF-7 为例,看看有什么问题。在此处查看一些示例:http ://www.webappsec.org/projects/articles/091007.txt
存储和显示 HTML 是两件不同的事情。
将 HTML 存储在 MySQL 中就mysql_real_escape_string()
足够了,并且可以保护您免受 SQL 注入。
对于显示,这取决于。您希望用户能够编写 HTML,但又希望免受 XSS 攻击等攻击,因此您应该使用 HTMLPurifier 之类的过滤器(这就是 Stackoverflow 所做的)。您只需在从数据库中检索 HTML 后执行此操作。
你永远不需要使用htmlentities()
or htmlentities_decode()
。