我在我的网站上使用了tinymce作为论坛功能的一部分。我正在使用textarea的innerHTML并将其存储在SQL数据库中。
我在查看帖子帖子时检索标记。
我正在做什么安全问题? tinymce是否具有任何内置功能来阻止添加恶意内容/标记并因此保存?
答案 0 :(得分:2)
TinyMce在内容清理和输入清理方面表现相当不错(在客户端)。作为一个非常受欢迎的Web富文本编辑器,创建者花费了大量精力来确保在防止将恶意内容简单复制并粘贴到编辑器中时相当安全。您可以执行诸如启用/禁用清除,指定允许的标记/属性/字符等操作。
请参阅TinyMce Configurations Page。备注选项包括:valid_elements
,invalid_elements
,verify_html
,valid_styles
,invalid_styles
和extended_valid_elements
另外:你应该使用tinyMce的getContent()函数,而不是抓住textarea的innerHtml。见:getContent()
但这是所有客户端javascript!
虽然这些特色很好,但所有这些清理工作仍然在客户端进行。可以想象,可以修改客户端JS以停止转义/删除恶意内容。或者有人可以将错误数据发布到您的请求处理程序,而无需通过浏览器(使用curl或任何其他数量的工具)。
所以tinyMce提供了一个很好的客户端清理基线,但是为了安全起见,服务器应该假设它发送的任何内容都是脏的,因此应该谨慎对待所有内容。
服务器可以完成的事情:
即使您实施最复杂的客户端验证/清理/预防,就您的后端安全性而言,这一点毫无价值。可以在OWASP Cross Site Scripting Prevention Cheat Sheet和OWASP SQL Injection Prevention Cheat Sheet上找到防止恶意数据注入的绝佳参考。您不仅需要防止SQL注入类型攻击,而且如果任何用户提交的数据将在网站上显示XSS攻击,以供其他毫无戒心的用户查看。
除了清理服务器上的用户输入数据之外,您还可以尝试使用mod_security等内容来压缩包含指示恶意请求的某些模式的请求。您还可以在客户端和服务器端强制执行最大输入长度,以及为服务器添加最大请求大小,以确保某人不会尝试发送GB数据。如何设置最大请求大小因服务器而异。违反最大请求大小应导致HTTP 413/Request Entity Too Large
答案 1 :(得分:0)
继@jCuga's excellent answer之后,您应该在输出富文本的任何网页上实施Content Security Policy。
这使您可以有效地停止浏览器执行内联脚本。它目前是supported by现代浏览器,例如Chrome和Firefox。
这是通过页面中的HTTP响应标头完成的。
e.g。
Content-Security-Policy: script-src 'self' https://apis.google.com
如果用户设法将JavaScript注入到您的页面中,将停止执行内联JavaScript(它会被警告忽略),但会允许脚本标记引用您自己的服务器或https://apis.google.com
。这可以根据需要定制。
即使您使用HTML清理程序来删除任何恶意代码,最好将其与CSP结合使用,以防万一有任何漏洞通过网络。