vicky0000amu/NetScan
GitHub: vicky0000amu/NetScan
一个基于 Web 的全栈网络端口扫描器,通过浏览器表单操作 Nmap 并以表格展示解析结果,免去了命令行操作。
Stars: 0 | Forks: 0
# NetScan — 基于 Web 的 Nmap 端口扫描器
一个基于浏览器的网络端口扫描器。用户无需在终端中输入 `nmap` 命令,
只需填写一个小表单(目标 + 扫描类型),应用即会在服务器上
运行 Nmap,并在浏览器中展示解析后的结果。
**⚠️ 请仅扫描您自己拥有或获得明确书面授权测试的系统。**
在许多国家/地区,即使未造成破坏,扫描您无法控制的网络
也可能属于违法行为。`scanme.nmap.org` 是 Nmap 项目专门
为供大家练习而搭建的主机 —— 测试时请使用该目标。
## 1. 工作原理(宏观概览)
```
Browser (form) --POST /scan--> Express server --execFile("nmap", args)--> Nmap
|
v
parses Nmap's XML output
|
v
sends clean JSON back to browser
|
v
browser renders a results table
```
关键文件:
- `server.js` — Express 应用,定义了 `/` 页面和 `/scan` API 路由。
- `utils/nmapScanner.js` — 验证输入,运行 Nmap,解析 XML → JSON。
- `views/index.ejs` — HTML 页面(表单 + 结果区域)。
- `public/style.css`、`public/script.js` — 样式与前端逻辑。
- `Dockerfile` — 将 Node.js **和** Nmap 打包在一起,使其能够运行在
任何支持 Docker 的托管平台上。
### 为什么这不能通过“常规”的 Serverless 部署实现
像 Vercel 或 Netlify 这样的平台在沙箱中运行您的代码,没有 shell
访问权限,也没有系统软件包 —— 它们根本无法运行真正的 `nmap`
二进制程序。这就是为什么本项目提供了一个 `Dockerfile`:它将 Nmap 打包进了
容器镜像中,因此任何支持 Docker 的主机(Render、Railway、Fly.io、
VPS 等)都可以运行它。
### 为什么它能防范命令注入
在 `utils/nmapScanner.js` 中包含两层防护机制:
1. **输入验证** — 目标必须匹配 `/^[a-zA-Z0-9.\-:]{1,255}$/`,
这将拦截 `; | & $ \` ( )` 等字符,否则这些字符可能会被用来
拼接额外的 shell 命令。
2. **完全不涉及 shell** — 我们调用了 `execFile("nmap", [...args])`
而不是 `exec("nmap " + target)`。`execFile` 会将每个参数
直接传递给 `nmap` 进程,而无需将字符串交给
shell 解释,因此即使有漏网之鱼通过了验证,它也
只会被当作一个字面量(且很可能是无效的)目标名称。
3. **固定的扫描配置** — 用户从下拉菜单中进行选择(Quick / Standard /
Full / Ping),服务器将此选择映射为硬编码的 flag 列表。
用户的原始文本永远不会成为 Nmap flag。
## 2. 本地运行
### 前置条件
- Node.js 18+ ([nodejs.org](https://nodejs.org))
- 您的机器上已安装 Nmap:
- **Windows:** 从 [nmap.org/download.html](https://nmap.org/download.html) 下载安装程序
- **Mac:** `brew install nmap`
- **Linux (Debian/Ubuntu):** `sudo apt-get install nmap`
检查是否安装成功:
```
nmap --version
```
### 步骤
```
# 1. 进入项目文件夹
cd port-scanner
# 2. 安装 dependencies
npm install
# 3. 启动服务器
npm start
```
在浏览器中打开 `http://localhost:3000`。首先尝试使用 "Quick Scan" 配置
扫描目标 `scanme.nmap.org` —— 它速度很快,而且是 Nmap 团队
自己允许扫描的目标。
## 3. 部署应用 (Render,使用 Docker)
Render 是个不错的首选,因为它提供免费/低成本的套餐并且原生
支持 Docker。
1. 将本项目推送到 GitHub 仓库。
2. 访问 [render.com](https://render.com) → **New +** → **Web Service**。
3. 连接您的 GitHub 仓库。
4. Render 会自动检测到 `Dockerfile`。如果系统询问 runtime,
请选择 **Docker**。
5. 设置:
- **Instance type:** 免费套餐可用于测试,但全端口
扫描 (`-p-`) 速度很慢 — 拥有更多 CPU 的付费套餐响应会更迅速。
- **Port:** Render 会从 Dockerfile 自动检测 `EXPOSE 3000`,但
您也可以添加环境变量 `PORT=3000` 以明确指定。
6. 点击 **Create Web Service**。Render 将构建 Docker 镜像
(在构建期间安装 Nmap)并进行部署。
7. 上线后,您将获得一个形如 `https://netscan-xxxx.onrender.com` 的 URL。
### 其他托管平台
任何支持 Docker 的主机都以相同方式工作:**Railway**、**Fly.io**、
**Google Cloud Run**,或者您自己的 **VPS**(DigitalOcean/Linode droplet),
只需运行 `docker build` + `docker run` 即可。
## 4. 对外公开前的重要注意事项
如果您部署此应用以供互联网上的任何人使用,请考虑滥用问题:
- **内置了限流功能**(`server.js` 中的 `express-rate-limit`),
将每位访客在 15 分钟内的扫描次数限制为 10 次。您可以根据需要在
`server.js` 中调整这些数值。
- **考虑添加登录步骤**,以便只有您信任的人才能触发
扫描。一个公开且无需身份验证的扫描器很容易被他人利用,
在您不知情的情况下通过您的服务器扫描第三方,并且
在目标服务器的日志中显示的将会是您服务器的 IP。
- **考虑限制目标范围**,将其限定在特定的 IP 范围内(例如仅限您
自己的家庭/实验室网络),而不是允许任何主机名,特别是在您计划
与他人分享链接的情况下。
- "Full Scan" 配置(`-p-`,所有 65535 个端口)每个
目标可能需要数分钟 — `nmapScanner.js` 中设置的 2 分钟超时可能需要
进行调整,并且如果是在 Render 的免费套餐上,HTTP 请求可能会在
扫描完成之前就发生超时。对于课堂/演示用途,"Quick" 和 "Standard"
更加实用。
## 5. 未来可能的功能(非常适合作为黑客松的“未来工作”展示)
- 按用户保存扫描历史(需要数据库 + 登录功能)
- 将结果导出为 PDF/CSV
- 定时周期性扫描,并在出现新开放端口时发送电子邮件提醒
- 可视化网络拓扑图(节点/边)以替代表格展示
标签:CTI, Docker, Express, GNU通用公共许可证, MITM代理, Nmap, Node.js, 安全防御评估, 插件系统, 网络扫描工具, 自定义脚本, 虚拟驱动器, 请求拦截