将生成的标记存储在数据库安全问题中

tinymce storing generated markup in database security concerns

本文关键字:数据库安全 问题 存储      更新时间:2023-09-26

我在我的网站上使用了tinymce作为论坛功能的一部分。我正在采取textarea的innerHTML并将其存储在SQL数据库中。

在查看线程帖子时检索标记。

做我正在做的事情会有安全问题吗?tinymce是否有任何内置功能来阻止添加和保存恶意内容/标记?

TinyMce在内容清理和输入清理方面做得很好(在客户端)。作为一个非常受欢迎的web富文本编辑器,创建者花了很多精力使其相当安全,以防止简单的复制和粘贴恶意内容到编辑器中。您可以执行诸如启用/禁用清理,指定允许的标签/属性/字符等操作。

参见TinyMce配置页面。可选参数包括:valid_elementsinvalid_elementsverify_htmlvalid_stylesinvalid_stylesextended_valid_elements

另外:您应该使用tinyMce的getContent()函数,而不是抓取textarea的innerHtml。看到:getContent ()

但这都是客户端javascript!

尽管这些特性很好,但所有这些清理工作仍然发生在客户机上。因此可以想象,可以修改客户端JS以停止转义/删除恶意内容。或者有人可以不通过浏览器(使用curl或任何其他工具)就将错误数据发送到您的请求处理程序。

所以tinyMce提供了一个很好的客户端清理基线,但是为了安全,服务器应该假设它发送的任何东西都是脏的,因此应该谨慎对待所有内容。

服务器可以做的事情:

即使你实现了最复杂的客户端验证/清理/预防,就你的后端安全而言,这是毫无价值的。在OWASP跨站点脚本预防备忘单和OWASP SQL注入预防备忘单中可以找到防止恶意数据注入的优秀参考资料。您不仅要防止SQL注入类型的攻击,而且要防止XSS攻击,如果任何用户提交的数据将显示在网站上供其他毫无戒心的用户查看。

除了清理服务器上的用户输入数据之外,您还可以尝试使用mod_security之类的方法来压缩包含指示恶意请求的某些模式的请求。您还可以在客户端和服务器端强制输入的最大长度,以及为服务器添加最大请求大小,以确保有人不会尝试发送GB的数据。如何设置最大请求大小将因服务器而异。违反最大请求大小将导致HTTP 413/请求实体太大

除了@jCuga的出色回答之外,您还应该在输出富文本的任何页面上实现内容安全策略。

这允许你有效地阻止内联脚本被浏览器执行。目前Chrome和Firefox等现代浏览器都支持。

这是由你的页面的HTTP响应头完成的。

Content-Security-Policy: script-src 'self' https://apis.google.com
如果用户设法将内联JavaScript注入到您的页面中,

将阻止执行它(它将被忽略并发出警告),但将允许脚本标记引用您自己的服务器或https://apis.google.com。这可以根据您的需要定制。

即使您使用HTML杀毒器来去除任何恶意标记,也最好将其与CSP结合使用,以防有任何东西溜过网络。