1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

JavascriptでFirebaseのrealtimeDatabaseを使う時のセキュリティを考える

Last updated at Posted at 2020-10-16

Firebaseを使うと簡単にデータベースを使う事ができる。という事はしっていた。
realtimeDatabaseなどに関しては、SQLみたいな知識もほとんどいらない状態だった。

好きなjsonを作ってそのままの形で内部のjsonに吊り下げていける。というイメージで、javascriptで階層をいくらでも深くほれる。が、ここで問題がある

#好きなようにデータベースをいじれる→おもいっきり突っ込まれる→従量課金→破産。

このサービスの利点であり、欠点は従量課金である事。従量課金であれば、スパムみたいのにアタックされたら、金額もかなりが吹っ飛ぶとは思う。

#問題点:大量にデータをつっこまれると破産

ここでから、できる事を整理をすると

###ユーザーに認証をさせる。
認証はドメインなどで認証ができるので、アップロードするサーバーのドメインで認証をすると変なアクセスをはじける。
authorizedで出来る。(匿名ログイン)

###認証情報がないとデータベースへ投稿をできなくする。
これは割とrulesっていうので、出来る。

###認証情報を元にIDを発行してIDに紐付いた構造だけをいじれる
これもrulesで対応ができる。

ここまでで、投稿したユーザーがtable/userID/***のみしかいじれないようになるので、他の人の情報を消したり、変更したりってできないようにする事ができた。

#ユーザーの特定はできても、データを突っ込まれる可能性はまだある。
ここからは少しひらめきを書いていく。

###createを使わないでupdateを使う
{name:aaa,old:17}みたいのを変更はできても{name:aaa,old:17,sex:male}みたいに項目は追加できない。一つの情報量は一定以上には入らないはずなので、データを大量に突っ込まれる可能性は少なくなる

###createはユーザー登録時に行う
データを入力するエリアを作るにはどうしたらいいかと言うと、Functionと言う機能がある。functionはイベントをトリガーにして内部でプログラムを実行する事ができるので、ユーザーが認証をしたら、その段階で、そのユーザーの情報を{name:'',old:0}みたいのをcreateする。これは内部的な処理になるので、データベースのcreateがfalseでも作れるはず。もしくは、作れるように設定ができるはず。

#1ユーザーから、大量のデータをつっこまれなくても、大量のユーザーからデータを突っ込まれる可能性はまだある。
同時並行で大量の認証をするアカウントを作って、それを書き込みまくる。みたいな事をされない限り問題はなくなる。

ここで、authorizeを見ると
###同一IPからの新規作成の数を制限
30に変更などもできるので、大量の認証アカウントを同一IPから発行する事もできなくなる。


ここまででが、現状javascriptで出来るであろうセキュリティ対策の内容で、ここで更に出来ることといえば、
各データの入力できる値の制限ができるのであれば(例えば文字数20までとか)

が対応方法としては有力かなと思います。

あとは、予算を設定している場合には、予算に対してのどれくらいの予算が消化されているかでアラート通知が来るようにはなっているが、一晩で気づかぬウチにアタックをくらっていたら、終わりじゃないかとは思ってるが、予算のアラートをいれておくのも、それなりに有効な手ではあると思う。

#追記

FIREBASE

ここにある手順でいい感じのルール設定ができた。

##格納するKEYを設定ができる。

".validate": "newData.hasChildren(['A','B','C'])", みたいにして、A、B、Cが揃ってないと生成できませんよ。っていう事ができた。これだとA,B,C,Dも可能になるが、A,Cなどは不可能になる

##格納する値の種類を設定ができる。
"A": { ".validate": "newData.isString() && newData.val().length < 20" },Aは文字列であり、20文字以内である。みたいに条件の設定をできる。

##条件を設定してないのは、セキュリティではじく
"$other": { ".validate": false }と設定すると、条件を設定してない、値が格納されようとしてもはじく事ができる。

これで、

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?