在Firebase存储中,安全规则用于控制对存储数据的访问权限。为了确保数据的安全性,Firebase存储安全规则支持使用参数哈希来验证上传文件的完整性和真实性。
参数哈希是一种将文件内容与特定参数(如用户ID、时间戳等)结合生成的唯一标识符。通过比较上传文件的哈希值与预期哈希值,可以验证文件是否被篡改或未经授权访问。
以下是使用参数哈希的Firebase存储安全规则示例:
首先,在Firebase控制台中定义存储安全规则。假设我们希望验证上传文件的哈希值是否与预期值匹配:
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read: if request.auth != null;
allow write: if request.auth != null &&
request.resource.size < 10 * 1024 * 1024 && // 限制文件大小为10MB
request.resource.contentType.matches('image/.*') && // 限制文件类型为图片
request.resource.md5hash == computeHash(request.resource.name, request.auth.uid, request.time); // 验证哈希值
}
}
}
在客户端代码中,计算上传文件的哈希值并与预期值进行比较。以下是一个使用JavaScript计算文件哈希值的示例:
async function computeHash(fileName, userId, timestamp) {
const file = document.getElementById('fileInput').files[0];
const encoder = new TextEncoder();
const data = encoder.encode(`${fileName}:${userId}:${timestamp}`);
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
const hashArray = Array.from(new Uint8Array(hashBuffer));
const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
return hashHex;
}
在上传文件之前,计算文件的哈希值并与Firebase存储安全规则中的预期值进行比较:
async function uploadFile() {
const file = document.getElementById('fileInput').files[0];
const userId = firebase.auth().currentUser.uid;
const timestamp = Date.now();
const hash = await computeHash(file.name, userId, timestamp);
const storageRef = firebase.storage().ref();
const fileRef = storageRef.child(file.name);
const uploadTask = fileRef.put(file);
uploadTask.on('state_changed', (snapshot) => {
// 处理上传进度
}, (error) => {
// 处理上传错误
}, () => {
// 上传完成
console.log('File uploaded successfully');
});
}
通过这种方式,你可以确保上传文件的完整性和真实性,防止文件被篡改或未经授权访问。
领取专属 10元无门槛券
手把手带您无忧上云