Saya sedang mengembangkan aplikasi yang tidak memerlukan masuk karena tidak ada data khusus pengguna. Rencana awal saya adalah membuat seluruh database saya hanya dapat dibaca. Namun, setelah melakukan beberapa penelitian, saya menemukan bahwa aturan keamanan tersebut akan membuat database saya sangat rentan. Rencana baru saya adalah menerapkan otentikasi anonim untuk setiap pengguna baru yang membuka aplikasi saya dan kemudian menghapus pengguna itu setelah mereka keluar dari aplikasi saya. Aturan keamanannya hanya mengizinkan membaca jika pengguna diautentikasi. Apakah ini cukup untuk mencegah seseorang menggunakan kueri yang menyalahgunakan ke database saya?

1
Jnguyen22 10 Maret 2020, 02:20

1 menjawab

Jawaban Terbaik

Umumnya, Tidak.

Semata-mata menggunakan otentikasi anonim menambahkan rintangan untuk mengakses database Anda dan akan melindunginya dari kueri baca sederhana seolah-olah database Anda sepenuhnya terbuka, tetapi Anda harus menggabungkannya dengan aturan keamanan yang membatasi kueri yang dapat dilakukan.

Dengan asumsi kita mulai dengan aturan barebone ini:

// Allow read access on all documents to any user signed in to the application,
// and write access to only administrators
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read: if request.auth.uid != null;
      allow write: if request.auth.token.isAdmin === true;
    }
  }
}

Untuk memperketat aturan Anda, Anda harus terlebih dahulu menghapus entri wildcard dan menggantinya dengan jalur dokumen tetap.

// Allow read access on all documents at /posts/{postId} to any user signed in to the application,
// and write access to only administrators
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /posts/{postId} {
      allow read: if request.auth.uid != null;
      allow write: if request.auth.token.isAdmin === true;
    }
  }
}

Atau bahkan

// Allow read access on all documents at /posts/{postId} to any user signed in to the application,
// and write access to only administrators
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /posts/{postId} {
      allow read: if request.auth.uid != null;
      allow write: if request.auth.token.isAdmin === true;

      // allow same permissions on subcollections of /posts/{postId}
      match /{document=**} {
        allow read: if request.auth.uid != null;
        allow write: if request.auth.token.isAdmin === true;
      }
    }
  }
}

Selanjutnya Anda harus mempertimbangkan untuk menambahkan aturan yang membatasi ukuran kueri yang dilakukan terhadap database Anda menggunakan aturan keamanan terperinci list seperti yang dijelaskan di Securely query data dari Dokumentasi Firebase.

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /posts/{postid} {

      // Deny any query not limited to 10 or fewer documents
      allow list: if request.auth != null
                  && request.query.limit <= 10;

      // Anyone can retrieve an individual post
      allow get: if request.auth != null;

      // Only an admin can write to posts
      allow write: if request.auth.token.isAdmin === true;
    }
  }
}

Bergantung pada seberapa sering data diperbarui, Anda juga dapat mempertimbangkan untuk menyimpan bundel data di Firebase Storage atau Anda bahkan dapat menyajikan data dari Firebase Hosting yang dapat dilayani oleh CDN alih-alih aplikasi Anda.

3
samthecodingman 27 Maret 2020, 03:48