

## 关于查询(query)权限中使用 $and $or 以及 $neq 等操作符的安全问题

### 讨论示例-1：

```json
{
  f1: 0,
  f2: 1,
  f3: {
    $neq: 2
  },
}
```
规则-a: `$condition: query.f1 == 0`，这种情况， 默认 f1 和 f2 是 AND 关系， 规则指定 f1 == 0 才能通过， 不关心 f2、f3 的查询条件不必考虑，f1 == 0 是唯一严格规则。

规则-b: `$condition: query.f3 == 0`，表示 f3 只能为指定值，不可为操作符，只要 f3 == 0 不成立，都不予通过。

规则-c: `$condition: query.f3.$neq == 2`， 如果改成这个样子，那就也算是可以针对操作符做规则限定了，不过限定的比较死，使用场景应该不多。

规则-d: `$condition: query.f3 != 0`，表示 f3 只要为不 0，便可通过，属于很宽松的条件，场景相对较少。


### 讨论示例-2：
```json
{
  uid: 1,
  f2: {
    $neq: 2
  },
  $and: [ { f3: { '$ne': 0 } }, { f3: { '$ne': 1 } } ],
}
```
规则-a: `$condition: query.uid == 0`，此为严格规则 uid 必须为 0， 只要满足 uid == 0 的数据，可以由客户端任何查询。故支持 $and $or 没有问题。


### 讨论示例-3：

```json
{
  uid: 1,
  f2: {
    $neq: 2
  },
  $or: [ { f3: { '$ne': 0 } }, { f3: { '$ne': 1 } } ],
}
```
规则-a: `$condition: query.uid == 0`，此为严格规则 uid 必须为 0， 只要满足 uid == 0 的数据，可以由客户端任何查询。故支持 $and $or 没有问题。


### 讨论示例-4：查询 两个用户的数据

```json
{
  uid: {
    $in: [1, 2]
  },
}
```
规则-a: `$condition: query.uid == 1 || query.uid == 2`， 该规则表示 uid 必须等于 1 或 必须等于2，并不支持 $in 操作符，帮规则不通过。 如果需要两种数据，建议客户端分两次查询，一次 `{uid:1}` 第二次 `{uid:2}` ，然后将数据在前端合并即可。


## 总结

规则验证时， 以“值”为依据，而操作符是指定的条件，并不能通过规则验证。
