9.5 网络安全警示
Tip
很多时候,黑客并不需要高超的技术,他只是推了一下你那没锁的门。
1. 为什么要学这个?
你觉得自己的小项目没人看,所以安全无所谓。
但互联网上漂浮着无数自动化的"鲨鱼"(扫描脚本)。
它们不分昼夜地扫描 0.0.0.0 上的开放端口。
当你把内网穿透打开,或者把数据库端口暴露在公网的那一秒,你其实是像黑暗森林里点燃了一根火把。
不懂安全,你的数据就不属于你,它属于下一个扫描到它的脚本小子。
2. 核心概念:暴露面 (Attack Surface)
什么是暴露面?
你可以被外界访问的点,就是暴露面。
localhost:3000-> 安全(只有你能访问)。0.0.0.0:3000-> 风险(局域网内能访问)。ngrok http 3000-> 高危(全世界都能访问)。
致命误区
很多人认为:"我的 Ngrok 链接是随机生成的,别人猜不到。" 错。 很多爬虫专门扫描 Ngrok 的子域名。隐蔽性安全 (Security by Obscurity) 是最不可靠的。
3. 解决方案 (HOW)
1. 绝不裸奔:Basic Auth
如果你必须用 Ngrok 暴露服务,哪怕只有 1 分钟,也要加密码。 Ngrok 自带了这个功能:
# 用户名: admin, 密码: 123
ngrok http 3000 --basic-auth="admin:123"
现在,任何访问者都会被浏览器弹窗要求输入密码。
2. 精准打击:IP 白名单
如果你在 Next.js 里写 API,可以用 Middleware 拦截陌生 IP。
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const ip = request.ip;
// 只允许公司固定 IP (假设是 203.0.113.1)
if (ip !== '203.0.113.1') {
return new NextResponse('Forbidden', { status: 403 });
}
}
3. 永远不要穿透数据库
这是铁律。 你可以穿透 Web 服务 (Port 3000),但绝对不要穿透数据库端口 (3306, 5432, 27017)。 一旦暴露,数据库被爆破只是时间问题。
4. 真实案例
Story
2017 年 MongoDB 勒索赎金事件
2017 年初,互联网上爆发了一场针对 MongoDB 的屠杀。
数万台服务器上的数据库在一夜之间被清空。
黑客留下了一张表 WARNING:"你的数据已被我备份,支付 0.5 比特币取回。"
原因:
绝大多数受害者都是为了方便远程连接,把 MongoDB 的配置文件 bind_ip 改成了 0.0.0.0,而且默认没有设置密码。
结果:
其实黑客根本没备份数据,他们写了个简单的脚本:连接 -> Drop Database -> Create Note。受害者交了钱也拿不回数据。
Vibe 心法:方便和安全通常是互斥的。当你觉得"连接数据库好麻烦"并试图绕过限制时,你正在亲手给黑客递刀子。
5. 本章小结
- 加锁:暴露必加锁 (Basic Auth)。
- 隔离:数据库永远只监听
127.0.0.1,不要让它见公网。 - 敬畏:永远假设公网是恶意的,不要存侥幸心理。