如何使用安全规则来防止用户伪造Firebase.ServerValue.TIMESTAMP?

mim*_*ing 5 javascript firebase firebase-security

我的应用程序需要可靠的时间戳值来创建新记录.我正在使用Firebase.ServerValue.TIMESTAMP来确保这一点.这是我的代码:

var ref = new Firebase("https://test-firebase-please-ignore.firebaseio.com/foo");
ref.set(Firebase.ServerValue.TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)

或者在REST中:

$ curl -X PUT -d '{"foo":{".sv":"timestamp"}}' \
  https://test-firebase-please-ignore.firebaseio.com/.json 
Run Code Online (Sandbox Code Playgroud)

如何防止滥用用户制作看似有效的请求,但实际上是过去或将来的假时间戳?这是他们可能使用的代码:

var ref = new Firebase("https://test-firebase-please-ignore.firebaseio.com/foo);
ref.set(1408643272324); //A timestamp in the past
Run Code Online (Sandbox Code Playgroud)

mim*_*ing 12

您可以使用.validate规则和now内置变量强制执行此操作.

这是一个执行此操作的安全规则:

{
    "rules": {
        ".read": true,
        ".write": true,
        "foo" : {
          ".validate": "newData.val() == now"
          }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用REST API使用这些cURL命令对其进行验证.首先,一个否定的案例:

$ curl -X PUT -d '{"foo":"1408638610143"}' \
https://test-firebase-please-ignore.firebaseio.com/.json

{
  "error" : "Permission denied"
}
Run Code Online (Sandbox Code Playgroud)

然后是一个积极的案例:

$  curl -X PUT -d '{"foo":{".sv":"timestamp"}}' \
https://test-firebase-please-ignore.firebaseio.com/.json

{"foo":1408638609500}
Run Code Online (Sandbox Code Playgroud)

  • 显然,请选择一个时间间隔,伙计们...也许正负 60000 毫秒,以确保互联网连接不好的用户不会被拒绝...使用这种严格的相等将 100% 失败! (2认同)