Firebase Web:如何仅允许自有域名读写数据库?
如何限制仅自有域名可读写你的数据库
嘿,这个问题太典型了——做无认证的轻量Web应用时,最担心的就是被人恶意刷库或者篡改数据。完全可以通过数据库端规则+服务器CORS配置来实现只允许你的域名发起请求,下面给你一步步拆解可行的方案:
1. 数据库层面的安全规则(核心防线)
如果你的数据库用的是Firebase、Supabase、Appwrite这类BaaS服务,它们都自带了安全规则引擎,直接在数据库端校验请求的来源域名,这是最可靠的方式(因为前端的限制很容易被绕过)。
举个Firebase Firestore的规则例子,只允许https://your-domain.com的请求读写:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { // 校验请求来源是否是你的域名 allow read, write: if request.origin == "https://your-domain.com"; } } }
如果是Supabase,你可以在SQL里设置Row Level Security(RLS),结合请求的来源头来限制:
CREATE POLICY "Only allow requests from my domain" ON your_table FOR ALL USING ( current_setting('request.headers.origin') = 'https://your-domain.com' );
这种方式的好处是:哪怕有人直接用Postman或者curl发送请求,数据库也会直接拒绝非允许域名的请求,从根源上阻断非法访问。
2. 后端中间层的CORS配置(双重保障)
如果你的数据库是通过自己的后端接口来访问的(而不是直接在前端调用数据库API),那可以在后端配置CORS,只允许你的域名跨域请求。
比如用Node.js Express框架的话,用cors包来配置:
const cors = require('cors'); const express = require('express'); const app = express(); // 只允许你的域名发起跨域请求 app.use(cors({ origin: 'https://your-domain.com', credentials: true // 如果需要携带Cookie的话开启 }));
这样一来,浏览器会自动拦截来自其他域名的请求,同时后端也会拒绝非允许域名的请求,形成双重保障。
3. 前端辅助校验(仅作为补充)
前端的限制很容易被懂技术的人绕过(比如修改本地JS代码、禁用浏览器同源策略),但可以加一层辅助校验,拦截大部分非预期的前端请求:
// 在发送数据库请求前校验当前页面的来源 const allowedOrigin = "https://your-domain.com"; if (window.location.origin !== allowedOrigin) { console.error("非法请求来源,已拦截"); return; } // 继续执行数据库读写逻辑 $.ajax({ url: "your-db-api-url", // ...其他配置 });
记住,这个只是锦上添花,不能作为主要的安全措施。
几个关键注意点
- 别忘了把开发环境的域名也加进去,比如
http://localhost:3000,不然本地开发时会被拦截; - 如果你的域名有多个子域名,比如
app.your-domain.com和www.your-domain.com,可以用通配符或者数组来配置(比如Firebase规则里用request.origin.matches(/^https:\/\/.*\.your-domain\.com$/)); - 浏览器的同源策略只限制前端页面发起的请求,直接用工具发送的请求不受限制,所以数据库端的规则才是核心,不能只依赖CORS或者前端校验。
内容的提问来源于stack exchange,提问作者cht
相关产品推荐
相关产品推荐

