Vibe Tutorial
Localhost 与公网访问

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. 本章小结

  1. 加锁:暴露必加锁 (Basic Auth)。
  2. 隔离:数据库永远只监听 127.0.0.1,不要让它见公网。
  3. 敬畏:永远假设公网是恶意的,不要存侥幸心理。