如何在不使用 firebase 身份验证的情况下保护 firebase 存储? (下一个)
How to secure firebase storage without using firebase auth? (nextjs)
我使用 firebase 存储在我的 next.js
页面中上传文件。客户填写表格,文件将上传到 firebase 存储中。 (我正在使用不同的数据库)
我想知道如何只允许在此 post 请求中上传文件。
import React, { useState } from "react";
import { render } from "react-dom";
import { storage } from "../src/firebase/index";
const ReactFirebaseFileUpload = () => {
const [image, setImage] = useState(null);
const [url, setUrl] = useState("");
const [progress, setProgress] = useState(0);
const handleChange = e => {
if (e.target.files[0]) {
setImage(e.target.files[0]);
}
};
const handleUpload = () => {
const uploadTask = storage.ref(`images/${image.name}`).put(image);
uploadTask.on(
"state_changed",
snapshot => {
const progress = Math.round(
(snapshot.bytesTransferred / snapshot.totalBytes) * 100
);
setProgress(progress);
},
error => {
console.log(error);
},
() => {
storage
.ref("images")
.child(image.name)
.getDownloadURL()
.then(url => {
setUrl(url);
});
}
);
};
return (
<div>
<progress value={progress} max="100" />
<br />
<br />
<input type="file" onChange={handleChange} />
<button onClick={handleUpload}>Upload</button>
<br />
{url}
<br />
<img src={url || "http://via.placeholder.com/300"} alt="firebase-image" />
</div>
);
}
export default ReactFirebaseFileUpload;
这是我使用开放规则的工作示例。
我的规则:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if true;
}
}
}
我想把上传放在next.jsapi路由系统上,所以我们有一个api可以调用。在我的想象中,要么我可以用 headers 或其他东西以某种方式保护这部分,或者甚至可以更好地在我的存储规则中定义一些东西。
我真的没有找到任何聪明的定义。
求指导帮我扔这个
如果任何人(没有授权)需要上传数据,您需要授予他 write
访问您存储中特定 path
的权限。
要从 ref
中获取 donwloadURL
,它需要 read
权限。
如果根据您的业务逻辑,任何人都可以上传但不需要 downloadURL
,您可以删除每个人的 read
。
我肯定会建议在特定 path
下上传此类文件,例如“public”,并且至少像此处对图像进行文件大小和内容类型的限制:
match /public/{allPaths=**} {
allow read: if true
allow write: if request.resource.size < 15 * 1024 * 1024
&& request.resource.contentType.matches('image/.*')
}
不要忘记 downloadURL
是对每个文件的 public 访问 URL。因此,拥有 URL 的任何人都可以访问该文件。您需要 read
规则才能从引用中获取 downloadURL
,但如果您从其他地方获取 downloadURL
,您仍然可以访问该文件。它们的制作方式不容易质疑它们,因此这是一种非常安全的方法。
如果可以的话,您可以使用管理 SDK 自行完成,只需 return downloadURL
或使用带有存储触发器的 Firebase Cloud Functions 来监听文件上传(访问受限像上面一样)并将 downloadURL
存储在你需要的地方。
Here 你很好地解释了所有这些如何协同工作。
我使用 firebase 存储在我的 next.js
页面中上传文件。客户填写表格,文件将上传到 firebase 存储中。 (我正在使用不同的数据库)
我想知道如何只允许在此 post 请求中上传文件。
import React, { useState } from "react";
import { render } from "react-dom";
import { storage } from "../src/firebase/index";
const ReactFirebaseFileUpload = () => {
const [image, setImage] = useState(null);
const [url, setUrl] = useState("");
const [progress, setProgress] = useState(0);
const handleChange = e => {
if (e.target.files[0]) {
setImage(e.target.files[0]);
}
};
const handleUpload = () => {
const uploadTask = storage.ref(`images/${image.name}`).put(image);
uploadTask.on(
"state_changed",
snapshot => {
const progress = Math.round(
(snapshot.bytesTransferred / snapshot.totalBytes) * 100
);
setProgress(progress);
},
error => {
console.log(error);
},
() => {
storage
.ref("images")
.child(image.name)
.getDownloadURL()
.then(url => {
setUrl(url);
});
}
);
};
return (
<div>
<progress value={progress} max="100" />
<br />
<br />
<input type="file" onChange={handleChange} />
<button onClick={handleUpload}>Upload</button>
<br />
{url}
<br />
<img src={url || "http://via.placeholder.com/300"} alt="firebase-image" />
</div>
);
}
export default ReactFirebaseFileUpload;
这是我使用开放规则的工作示例。
我的规则:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if true;
}
}
}
我想把上传放在next.jsapi路由系统上,所以我们有一个api可以调用。在我的想象中,要么我可以用 headers 或其他东西以某种方式保护这部分,或者甚至可以更好地在我的存储规则中定义一些东西。
我真的没有找到任何聪明的定义。
求指导帮我扔这个
如果任何人(没有授权)需要上传数据,您需要授予他 write
访问您存储中特定 path
的权限。
要从 ref
中获取 donwloadURL
,它需要 read
权限。
如果根据您的业务逻辑,任何人都可以上传但不需要 downloadURL
,您可以删除每个人的 read
。
我肯定会建议在特定 path
下上传此类文件,例如“public”,并且至少像此处对图像进行文件大小和内容类型的限制:
match /public/{allPaths=**} {
allow read: if true
allow write: if request.resource.size < 15 * 1024 * 1024
&& request.resource.contentType.matches('image/.*')
}
不要忘记 downloadURL
是对每个文件的 public 访问 URL。因此,拥有 URL 的任何人都可以访问该文件。您需要 read
规则才能从引用中获取 downloadURL
,但如果您从其他地方获取 downloadURL
,您仍然可以访问该文件。它们的制作方式不容易质疑它们,因此这是一种非常安全的方法。
如果可以的话,您可以使用管理 SDK 自行完成,只需 return downloadURL
或使用带有存储触发器的 Firebase Cloud Functions 来监听文件上传(访问受限像上面一样)并将 downloadURL
存储在你需要的地方。
Here 你很好地解释了所有这些如何协同工作。