angular - 从 Firebase 提供的已清理用户内容的安全性
问题描述
首先我会分情况描述:
我正在使用 angular 和 firebase 构建应用程序。Angular 客户端有输入,用户可以在其中编写一些自定义内容,我希望这些内容能够到达 text aka markdown/html 以允许链接、粗体、斜体等...
此输入的内容保存在 firebase 数据库中,然后再加载回其他用户 - 基本上您可以将其想象为堆栈溢出问题的简单情况。
我们知道客户端提供的任何内容都是不安全的,这意味着如果后端不清理此消息的内容,就有可能造成 XSS 攻击。提供来自 firebase 的任何消息都可能是危险的,但是当我使用尖括号时,我的内容{{ message }}
应该被转义,并且像这样的消息:
my message and <script> evilScript(); </script>
应该按原样提供。
现在,假设我们不使用纯文本消息,而是使用 html 或 markdown。在这种情况下,看到以下内容是完全正常的:
**hello** it is me
<strong>hello</strong> it is me
但这一次我不能照原样服务。我不能允许提供纯 html,因为这对最终用户不安全。在降价的情况下,我必须先将其转换为 html,所以这几乎是相同的情况(除了我只做了一个额外的步骤)。简单地说,在这种情况下,我必须先清理消息。
如何处理?
由于 firebase 仅将信息存储在数据库中,因此我只能在最终用户 Angular 客户端中保护我的应用程序。在这种情况下,当用户消息从 firebase 到达时对其进行清理是个好主意吗?它安全吗?在服务之前检查内容时,是否有欺骗角度应用程序的方法?如果是,你能告诉我例子并告诉我如何处理这种情况吗?
解决方案
在将内容添加到 DOM(通过角度)之前,通过 DOMPurify 运行内容。它将确保 HTML 是静态的(不包含活动代码),并且 DOMPurify 是由一些世界上最好的 XSS 研究人员创建的。 https://github.com/cure53/DOMPurify
推荐阅读
- bash - 如何使用tail和grep并获取具有结果的文件名
- javascript - 单选按钮值正在打印“on”而不是它持有的值
- c++ - 这是缓存线程安全的通用实现(c++)吗?
- java - 带有 ASM 的 JVM INVOKESPECIAL 私有构造函数
- visual-studio-code - VSCode:不在项目中的文件在单独的窗口中打开
- php - 如何仅将 WordPress 的“the_title”过滤器用于帖子类型中的主标题?
- sql-server - 根据序号插入数据
- python - 从元组列表中删除部分重复的元组
- ruby-on-rails - 有人能告诉我这个 Rails 调试消息是什么意思吗?我想解决这个问题
- python - Discord.py 机器人事件的格式完全相同,但一个运行,一个不运行