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までとか)
が対応方法としては有力かなと思います。
あとは、予算を設定している場合には、予算に対してのどれくらいの予算が消化されているかでアラート通知が来るようにはなっているが、一晩で気づかぬウチにアタックをくらっていたら、終わりじゃないかとは思ってるが、予算のアラートをいれておくのも、それなりに有効な手ではあると思う。
#追記
ここにある手順でいい感じのルール設定ができた。
##格納する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 }と設定すると、条件を設定してない、値が格納されようとしてもはじく事ができる。
これで、