我不明白如何在一天内设置上传文件的限制.我希望用户每天最多发布10张照片.在数据库方面,我放了一个增量计数器.如果它达到一定的大小,则不允许用户发布其他内容.但是在存储方面,这是不可能的.攻击者可以无限制地发布他想要的所有文件.有没有解决方案来防止这种情况?提前致谢.我的安全规则是:
service firebase.storage {
match /b/projectid/o {
match /Photo/{user}/{photo}/image.jpg {
allow write: if request.auth != null &&
request.auth.uid == user && (
request.resource.size < 5 * 1024 * 1024 && photo.size() < 32 ||
request.resource == null);
allow read: if request.auth != null &&
request.auth.uid == user
}
}
}
最佳答案 嗯,这是一个非常简单的方法,这是正确的方法.
只允许在特定时间段内上传一定数量文件的hacky方法是将文件命名为具有一些数字属性:例如users / {userid} /0.jpg through users / {userid} /9.jpg( 10张照片).
您可以编写规则来检查如下:
// 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()
}
从长远来看,该解决方案能够从存储中引用数据库数据,反之亦然.不幸的是,这个世界尚未到来,但我们正朝着这个方向努力.