【问题标题】:Firebase rule to prevent HTML tagsFirebase 规则以防止 HTML 标记
【发布时间】:2021-08-13 17:54:17
【问题描述】:

我有一个 firebase 实时数据库,它允许用户发布 cmet,然后显示给其他用户。

有没有办法添加一个规则来验证没有提交 HTML 标记?例如:

This is my <b>comment</b> which I <text style="color:red;">have edited</text>

现在我知道我可以在用户端使用 javascript 来检查,但我需要将文本添加为​​ .html() 而不是 .text() 所以我认为最好通过firebase 规则。

这可能吗?

【问题讨论】:

  • 在客户端 JS 中执行此检查几乎毫无意义,因为它很容易解决。您需要清理服务器端的输入。
  • 您使用的是哪个数据库? RTDB 和 Firestore 的语法不同。
  • @samthecodingman 实时数据库

标签: javascript html firebase firebase-realtime-database firebase-security


【解决方案1】:

HTML 不是一种微不足道的语言,通常建议不要像 this thread 及其 linked duplicate 那样使用正则表达式解析 HTML。

但是,由于您只是使用它来测试是否存在类似 HTML 的标签而不是用于解析,因此您可以只针对正则表达式 /&lt;[^&gt;]*&gt;/ 进行测试。

假设你有一个类似这样的消息数据结构:

interface MessageData {
  author: string,
  content: string,
  /* ... */
}

并将它们作为/messages/someMessageId 存储在您的数据库中,您可以使用.validate rule 通过rules.String#matches() 应用测试:

{
  "rules": {
    "messages": {
      "$msgId": {
        "content": {
          // a message must be a string and not contain any HTML-like tags
          ".validate": "newData.isString() && !newData.val().matches(/<[^>]*>/)"
        }
      }
    }
  }
}

注意:另一种方法是使用Callable Cloud Function 发布消息,在将消息添加到数据库之前对其进行清理,或者使用trigger a Cloud Function 响应发布的消息并在之后清理消息.这两种方法都可以通过一种安全的方式对输入进行更深入的分析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 2016-02-25
    相关资源
    最近更新 更多