これは非常に簡単な方法です。これを行う正しい方法があります。
特定の期間に特定の数のファイルのみをアップロードできるようにするには、いくつかの数値プロパティ(例:users/{userid}/0.jpg
〜users/{userid}/9.jpg
)のファイル名を付けてください。
あなたは次のようにすることを確認するためにルールを記述することができます
// Match all filenames like 0.jpg
match /users/{userId}/{photoId} {
allow write: if photoId.matches('^\d\.jpg$')
}
をご桁以上の粒度が必要な場合は、あなたのような何かをすることができます半分だけ、私たちが解決
// Match all filenames like YYY.jpg where YYY is a number less than XXX
match /users/{userId}/{photoId} {
allow write: if int(photoId.split('\.')[0]) < XXX
}
を私たちはファイルの数を制限することができますが、ユーザーが単にファイルをアップロードしたい場合はどうなりますか?幸運なことに、エンドユーザーがファイルを上書きするのを防ぐルールを書くことができます(ただし、削除は削除する必要があります)。のは、見てみましょう:
// Allow files to be overwritten once a day, written if there's nothing there, or deleted as often as desired
match /users/{userId}/{photoId} {
allow write: if request.time > resource.timeCreated + duration.value(1, "d") || resource.size == 0 || request.resource.size == 0
}
これらの関数に組み合わせることができます
function isAllowedPhotoId(photoId) {
return int(photoId.split('\.')[0]) < XXX
}
function canOverwritePhoto() {
return request.time > resource.timeCreated + duration.value(1, "d") || resource.size == 0 || request.resource.size == 0
}
match /users/{userId}/{photoId} {
allow write: if isAllowedPhotoId(photoId) && canOverwritePhoto()
}
長期、解決策は、ストレージ内からデータベースのデータ、およびその逆を参照できることです。残念ながら、その世界はまだここにはありませんが、我々はそれに向かって取り組んでいます。
できることはいくつかあります。 1)検証されたユーザーのみが問題のノードを読み書きできるルールを実装します。これにより、攻撃者が任意のノードにアップロードするだけで済みます。 2)その日の 'upload_count'ノードを実装し、アップロード(書き込み)にタイムスタンプと同様にアップロードを含めます。その日のカウントが10未満の場合にのみアップロードを許可する検証ルールを設定します。あらかじめ定義されたルール変数 'now'と 'new data'を見て、現在のものと書き込もうとしているデータのタイムスタンプを比較したいと思うでしょう。 – Jay
ルールが表示されている場合、各ユーザーはそのノードにのみ書き込むことができますが、各ユーザーはそのノードに無制限のファイルを書き込めるという問題があります。私は第二のポイントを理解していない。データベースにはすでにカウンターがありますが、ストレージにはどうすればカウンターを保管できますか?データベースとストレージのルールは別々であり、攻撃者はデータベースのカウンタを更新せずにファイルをアップロードできることを忘れないでください。 – DThink
これを解決する方法はありませんか? – DThink