mBaaSのデータストアではACLを使ってデータの利用を細かく制限できます。自分や友達だけ閲覧や書き込み許可すれば、他人からそれらのデータにアクセスされることはありません。
しかし、あなたが望んでいないデータが紛れ込んでくる可能性はあります。今回はそうしたデータを除外する方法について紹介します。
データ例
たとえば次のようなデータを設定したとします。
message | データオーナー | 誰でも読み込み可 |
---|---|---|
これは個人用 | 自分 | × |
他の人のデータ | 他人 | × |
怪しいデータ | 他人 | ○ |
こうしたデータがあるとして、ログインしてデータを取り出してみましょう。
// 認証します await ncmb.User.login('user', 'password'); // データを取り出します const Demo = ncmb.DataStore('Demo'); const ary = await Demo .fetchAll(); // 出力します console.log(ary);
さて、この時の出力はどうなるでしょうか。実はデータが2件返ってきます。1件は自分のデータなので問題ありませんが、もう1件は他人が追加したデータになります。あなたのデータは安全ですが、他人があなたに余計なデータを見せることができるのです。
[ { "objectId": "r6E0WkwwSYyN0SPl", "acl": { "1zgUAYA2LFcVCTLL": { "read": true, "write": true } }, "message": "これは個人用" }, { "objectId": "7Lt9HjaBFDw1Xkf1", "acl": { "*": { "read": true, "write": true } }, "message": "怪しいデータ" } ]
これが起きる原因としては、正しいACLが設定されていないことが要因です。また、アプリケーションキーとクライアントキーが漏洩した場合に、こうしたデータを追加できてしまいます。他人のデータは操作できませんが、不正な文字列などを送り込まれるのも嫌なものでしょう。
防ぐ方法
そこで防ぐ方法を紹介します。検索時に、次のようにACLのフィルタリングを行います。以下はACLに全体読み込み許可されているデータを弾くという指定です。
// 認証します await ncmb.User.login('user', 'password'); // データを取り出します const Demo = ncmb.DataStore('Demo'); const ary = await Demo // 全体読み込み許可されているデータは弾く .notEqualTo('acl.*.read', true) .fetchAll(); // 出力します console.log(ary);
これで期待通り、自分のデータだけが返ってきます。
[ { "objectId": "r6E0WkwwSYyN0SPl", "acl": { "1zgUAYA2LFcVCTLL": { "read": true, "write": true } }, "message": "これは個人用" } ]
カラクリ
この検索条件はオブジェクト内の検索時に使える方法です。ACLの構造は次のようになっています。 acl.*.read
が true になっていれば、読み取り許可されているデータになります。これを弾くことで、適切なデータだけを取得できる訳です。
"acl": { "*": { "read": true, "write": true } }
防ぐ方法2
もう一つはアプリケーションキーとクライアントキーが漏洩し、他人がログインなしでデータを追加した場合に使える方法です。クラスのパーミッションを指定して、ログインユーザーしかクラスの操作ができないようにします。
こうすることで、ログインユーザーだけしかデータ操作を行えず、不正データ挿入への敷居を上げられます。なお、ログインしたうえで不正なデータを挿入するのは防げないので注意してください。
まとめ
アプリケーションキーとクライアントキーが漏洩したとしても、プッシュ通知が作成されると困る(これも管理画面で制御可能)くらいでACLを正しく行っていれば大きな問題にはなりません。たとえ漏れたとしても安心して運用が続けられるしくみにしておくことが大事です。