最近、firebaseから、リアルタイムデータベースに安全でないルールがあることを知らせるメールが届きました。これらは私が設定したルールです:
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
これは安全なルールではありませんか?
メール/パスワードは、私が有効にした唯一のサインイン方法です。
firebaser here
メールがそれらのルールに関して安全でないものについてあまり明確ではなかったとしたら申し訳ありません。ユーザーのデータを保護することは、アプリを利用可能にするための重要なステップです。そのため、以下でその仕組みについてもう少し詳しく説明します。
あなたが持っている(デフォルトの)ルールは、データベース全体へのバックエンドの完全な読み取り/書き込みアクセスにサインインしているすべてのユーザーに許可します。これは非常に基本的なセキュリティ層にすぎません。
一方でこれは、データベースへのアクセスを全員に許可するよりも安全です。少なくとも、サインインする必要があります。
一方、Firebase Authenticationで認証プロバイダを有効にすると、アプリを使用しなくても、誰でもバックエンドにログインできます。プロバイダーによっては、ブラウザーの開発者コンソールでJavaScriptを実行するのと同じくらい簡単です。また、サインインすると、データベース内のあらゆるものを読み書きできます。つまり、firebase.database().ref().delete()
のような単純なコマンドですべてのデータを削除できます。
データアクセスをより安全にするには、サインインしている各ユーザーが実行できることをより厳密に制御する必要があります。たとえば、/users
の下に各ユーザーに関する情報を含むプロファイルを保持するとします。すべてのユーザーにこれらのプロファイルへのアクセスを許可することもできますが、ユーザーに自分のデータの変更のみを許可することは間違いありません。次のルールでこれを保護できます。
{
"rules": {
"users": {
".read": true,
"$user_id": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($user_id)
".write": "$user_id === auth.uid"
}
}
}
}
これらのルールにより、すべてのプロファイル(認証されていないユーザーを含む)がすべてのプロファイルを読み取ることができます。ただし、各プロファイルを変更できるのは、そのプロファイルを持つユーザーのみです。これについて詳しくは、 ユーザーデータの保護に関するFirebaseのドキュメント をご覧ください。
データへのすべてのアクセスが許可されていることを確認することに加えて、保存されているすべてのデータがアプリに適用されているルールに対して有効であることを確認する必要があります。たとえば、ユーザーの2つのプロパティ(名前と年齢)を保存するとします(例のために、実際には代わりに生年月日を保存するとします)。したがって、これを次のように保存できます。
"users": {
"uidOfPuf": {
"name": "Frank van Puffelen",
"age": 48
}
}
このデータのみを書き込むことができるようにするには、次のルールを使用できます。
{
"rules": {
"users": {
".read": true,
"$user_id": {
".write": "$user_id === auth.uid",
".validate": "data.hasChildren('name', 'age')",
"name": {
".validate": "data.isString()",
},
"age: {
".validate": "data.isNumber()",
},
"$other: {
".validate": false
}
}
}
}
}
これらのルールにより、各ユーザープロファイルにname
プロパティとage
プロパティがあり、それぞれ文字列と数値が設定されます。誰かが追加のプロパティを書き込もうとすると、その書き込みは拒否されます。
上記は、(ユーザーの)データの保護について考える方法の簡単な入門書です。詳細については、 Firebaseセキュリティのドキュメント (および埋め込みビデオ)を確認することをお勧めします。