Common Database Rules for Firebase

Nếu bạn nào or team nào phát triển ứng dụng với Firebase thì việc set rules là một việc rất cần thiết và nó quan trọng trong việc bảo vệ dữ liệu trong Firebase. Trong bài viết nhanh này, tôi show cho các bạn những cách set rules trong firebase. Với những ai sử dụng thì việc này rất cần thiết để đọc bài này. Điều cần biết là Firebase là gì? và khi nào sử dụng Firebase?

↳ Yêu cầu người đọc:


1 - Hiểu về Firebase.

2 - Cách xác thực Fiebase

3 - Hiểu về Security in Firebase.

Với những ai muốn tìm hiểu thêm về Firebase thì có thể tham khảo tại đây: Tất tần tật bài viết về Firebase 

Vì sao chúng ta lại quan tâm đến việc set rules trong Firebase. Bởi vị mặc định trong khi chúng ta tạo Firebase thì rules sẽ là 

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

Nếu chúng ta set như vậy thì nghĩa là mọi user sẽ có quyền sửa đổi và đọc được hết data trong firebase. Qua đó user có thể change được các Event trên ứng dụng của chúng ta. Việc đó quá nguy hiểm. Vậy cho nên các bạn nên

tìm hiểu về cách check rules trong Firebase. 

// Không check security, trường hợp này chỉ sử dụng khi test environment 

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

// Full security

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

// Chỉ những user nào đã xác thực trên Firebase thông qua nhiều kiểu như sms, email... or customer token 

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

// chỉ khi uid của user bằng với uid trên database thì mới có quyền truy cập và chỉnh sửa dữ liệu của mình
// Hay nói cách khác thì user thì có quyền chỉnh sửa của thông tin của mình.

{
  "rules": {
    "posts": {
       "$uid": {
         ".read": "$uid === auth.uid",
         ".write": "$uid === auth.uid"
       }
     }
   }
}

// Xác định phân quyền mod hay user.

{
  "rules": {
    "posts": {
       "$uid": {
         ".write": "root.child('users').child('moderator').val() === true"
       }
     }
   }
}

// Validates string datatype and length range

{
  "rules": {
    "posts": {
       "$uid": {
         ".validate": "newData.isString()
                       && newData.val().length > 0
                       && newData.val().length <= 140"
       }
     }
   }
}

// Checks presense of child attributes

{
  "rules": {
    "posts": {
       "$uid": {
         ".validate": "newData.hasChildren(['username', 'timestamp'])"
       }
     }
   }
}

// Validates timestamp is not a future value

{
  "rules": {
    "posts": {
       "$uid": {
         "timestamp": {
           ".validate": "newData.val() <= now"
         }
       }
     }
   }
}


// Prevents Delete or Update
{
  "rules": {
    "posts": {
       "$uid": {
         ".write": "!data.exists()"
       }
     }
   }
}

// Prevents only Delete
{
  "rules": {
    "posts": {
       "$uid": {
         ".write": "newData.exists()"
       }
     }
   }
}

// Prevents only Update
{
  "rules": {
    "posts": {
       "$uid": {
         ".write": "!data.exists() || !newData.exists()"
       }
     }
   }
}

// Prevents Create and Delete
{
  "rules": {
    "posts": {
       "$uid": {
         ".write": "data.exists() && newData.exists()"
       }
     }
   }
}

Tham khảo trên github taị đây: https://gist.githubusercontent.com/codediodeio/6dbce1305b9556c2136492522e2100f6/raw/2be50d5012dfa5634eb3f2b7a1c9f36ed1306680/database.rules.json