yucatio@システムエンジニア

趣味で作ったものいろいろ

Firestoreで文字列を正規表現で制限するセキュリティルール

Firestoreのセキュリティルールでは、文字列を正規表現で制限することができます。悪意のあるユーザにおかしな値を登録されないようアプリと同じ制限をかけておきましょう。

String.matches(regex)

String.matchesを使うと、フィールドに登録される値が 指定された正規表現を満たす場合にのみ、DBに登録することができます。 記述はこのようになります。

// 電話番号(ハイフンなし)
allow create, update: if request.resource.data.tel.matches("^0[0-9]{9,10}$")
// メールアドレスっぽい文字列
// size()も組み合わせて使いましょう
allow create, update: if request.resource.data.email.matches("^[-a-zA-Z0-9_\\.]+@[-a-zA-Z0-9_\\.]+$") &&
                         request.resource.data.email.size() <= 255

String.matches()の使用例

例として参加登録フォームを作ってみます。

f:id:yucatio:20211026132400p:plain:w350

データ構造はこのようになっています。

f:id:yucatio:20211026150453p:plain

電話番号は0とそれに続く数字が9個か10個です。メールアドレスは半角英数と、記号は-_.が使えます。@マークは1つだけです。 セキュリティルールの全体はこのようになります。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /applications/{application} {
      function validApplication(docData) {
        return docData.tel.matches("^0[0-9]{9,10}$") &&
               docData.email.matches("^[-a-zA-Z0-9_\\.]+@[-a-zA-Z0-9_\\.]+$") &&
               docData.email.size() <= 255;
      }
      allow create, update: if validApplication(request.resource.data)
    }
  }
}

正規表現に合うように登録してみます。

f:id:yucatio:20211026132400p:plain:w350

Firebaseのコンソールで確認すると登録されていることが分かります。

f:id:yucatio:20211026141753p:plain

電話番号を12桁で登録してみます。

f:id:yucatio:20211026141917p:plain:w350

エラーになり、コンソールを確認すると登録されていないことが分かります。

f:id:yucatio:20211017172609p:plain

次に、メールアドレスに使えない文字列を使ってみます。

f:id:yucatio:20211026143959p:plain:w350

こちらもエラーになり、コンソールを確認すると登録されていないことが分かります。

f:id:yucatio:20211017172609p:plain

リンク

正規表現はこちらのものを参考にしました。 qiita.com