Supabaseの取得制限に注意しよう
背景
SupabaseのJavaScriptクライアントから7000件の配列を取得しようとしたら、明らかに全て取得できていなかった(地図にデータをマッピングしていたため、途中で途切れてるのがわかりやすかった)。
SupabaseのWeb UIからSQLを叩いてみたところ、データ自体はちゃんと7000件あった。
調査してみた
By default, Supabase projects return a maximum of 1,000 rows. This setting can be changed in your project's API settings. It's recommended that you keep it low to limit the payload size of accidental or malicious requests. You can use range() queries to paginate through your data.
By default, Supabase projects return a maximum of 1,000 rows.
ということなので、デフォルトではJavaScriptクライアントで1000件以上を指定しても、APIの制限により無視されるようです。今回は、1000件をはるかに超えるデータ数であるため、大きな影響を受けていたようです(先に計測した1000件分のみ取得できていた)。
設定する
Setting > API
の下部にある以下の設定を変えるだけです(以下は変更済み)。設定自体は簡単にできます。
注意点
Supabaseは1ヶ月のデータベースの通信量を記録しており、50GBを超えると追加で料金がかかるようになっています。また、SupabaseのAPIのURLとアクセストークンはクライアントサイドでデータを取得する限り、ユーザに流出してしまうため、データの取得制限を極端に大きくしてしまうことは危険です。そのため上記の公式ドキュメントで述べられているように、悪質なユーザへの対策として初期では1000件となっており、あまり大きな値にしないようにと警告されています。うっかり全データの取得を許してしまった場合、とんでもない料金を請求されるかもしれません、
対策
- 行レベルセキュリティで取得できるユーザを制限する
- クライアントサイドでデータ取得を行わない
- Next.jsは最近サーバサイドに力を入れているので実現できそう
- App Directory + Server Actionsはかなり安全に扱えそう
- TanstackやSWRからリクエストする場合は注意
- Next.jsは最近サーバサイドに力を入れているので実現できそう
- 実行時にlimitをつけることを忘れない
- 初歩的だけど非常に重要
- ただAPI直接叩かれる可能性があるので100%安全ではない
まとめ
便利でかつ安めのプランで魅力的なSupabaseですが、データベースと直接紐づいたREST APIが存在しているため、セキュリティ的に気をつけるべきところがあります。便利なサービスであることは確かなので、注意しながら使って行きたいですね。