aungphonemyint412-prog/HackingDetectingSystemOfUnauthorizedLoginDevices
GitHub: aungphonemyint412-prog/HackingDetectingSystemOfUnauthorizedLoginDevices
基于 Flask 的 Web 应用登录安全监控系统,通过规则引擎检测可疑登录行为并发送 Gmail 告警与 2FA 验证。
Stars: 0 | Forks: 0
# 黑客检测系统 (HDS)
这是一个 Flask Web 应用程序,用于监控用户登录、检测可疑活动,并通过 Gmail 向账户所有者发送警报。本项目作为毕业设计计算研究项目(Pearson BTEC HND Unit 16)开发。
## 在线演示
**https://hacking-detection-system-production.up.railway.app**
## 功能
### 认证
- **用户注册和登录** — 使用用户名/密码,并通过 Werkzeug 进行哈希处理
- **Google OAuth** — 通过 Google 登录或关联 Gmail 账户
- **双因素认证 (2FA)** — 将 OTP 验证码发送至电子邮件,每个账户均需验证
- **通过 OTP 忘记密码** — 通过 6 位数字电子邮件验证码进行自助密码重置
- **账户锁定** — 登录失败次数过多后自动锁定;30 分钟后自动解锁,或在重置密码后立即解锁
### 可疑登录检测 (R1–R8)
| 规则 | 触发条件 |
|------|---------|
| R1 | 出现未见过的 IP 地址 |
| R2 | 出现新设备类型(PC / Mobile / Tablet) |
| R3 | 出现新的浏览器系列 |
| R4 | 出现新的操作系统 |
| R5 | 在 00:00–04:59 UTC 期间登录 |
| R6 | 在短时间内多次成功登录 |
| R7 | **不可能的旅行** — 鉴于经过的时间,连续登录在地理上是不可能的(使用半正矢公式,阈值 >900 km/h) |
| R8 | 通过 ip-api.com 检测到 **VPN / proxy / TOR 出口节点** |
### 安全警报和通知
- **可疑登录警报** — 当触发 R1–R8 中的任何规则时发送电子邮件,包括:
- **风险评分 (0–100)** — 根据触发的规则计算,并带有颜色编码的徽章
- **安全建议** — 根据检测到的威胁提供量身定制的建议
- **“这是您吗?”按钮** — 确认登录合法(绿色)或拒绝并锁定账户(红色);链接在 48 小时后过期
- **登录通知** — 每次非可疑的成功登录都会发送一封常规通知邮件
- **密码已更改** — 每次更新密码时都会发送电子邮件通知
- **电子邮件地址已更改** — 向旧地址和新地址发送通知
- **2FA 已启用/禁用** — 关于更改的电子邮件确认
- **账户已锁定** — 触发暴力破解锁定时,发送带有解锁说明的电子邮件
### 地理定位
- **所有电子邮件中的 IP 地理定位** — 每次警报和 OTP 电子邮件都会显示登录尝试的城市、地区、国家、设备、浏览器和操作系统
- **存储坐标** — 每次登录都会保存经纬度,用于检测不可能的旅行 (R7)
- 由 ip-api.com 提供支持(免费,无需 API key)
### 仪表板与历史记录
- **登录历史记录** — 包含每次登录尝试的状态、位置、风险评分的完整分页日志
- **警报仪表板** — 查看所有安全警报,并跟踪已读/未读状态
- **攻击模拟面板** — 触发测试场景(新 IP、新设备、异常时间、暴力破解、测试电子邮件)
- **登录统计图表** — 7 天的登录量和设备细分(Chart.js)
## 检测阈值 (config.py)
| 设置 | 默认值 | 描述 |
|---------|---------|-------------|
| `MAX_FAILED_ATTEMPTS` | 3 | 触发暴力破解警报和锁定前的失败登录次数 |
| `FAILED_ATTEMPT_WINDOW` | 30 min | 计算失败登录次数的时间窗口 |
| `LOCKOUT_DURATION` | 30 min | 暴力破解后账户保持锁定的时间 |
| `RAPID_LOGIN_COUNT` | 3 | 触发 R6 的成功登录次数 |
| `RAPID_LOGIN_WINDOW` | 10 min | R6 检查的时间窗口 |
| `UNUSUAL_HOUR_START` | 0 | 异常时间窗口的开始 (UTC) |
| `UNUSUAL_HOUR_END` | 5 | 异常时间窗口的结束 (UTC) |
| `IMPOSSIBLE_TRAVEL_SPEED` | 900 km/h | R7 不可能的旅行的速度阈值 |
## 技术栈
- **后端** — Python 3, Flask 3, Flask-SQLAlchemy, Flask-Login, Flask-Dance
- **数据库** — SQLite(开发环境)— 在生产环境中将 `DATABASE_URL` 替换为 Postgres
- **认证** — Werkzeug 密码哈希、Google OAuth 2.0、通过 Gmail SMTP 发送 OTP
- **地理定位** — ip-api.com(免费,无需 API key;返回城市、地区、国家、纬度、经度、VPN 标志)
- **前端** — Bootstrap 5, Chart.js, Font Awesome
## 项目结构
```
├── app.py # All routes and application logic
├── config.py # Configuration (reads from .env)
├── models.py # SQLAlchemy models
├── detection.py # Rule-based suspicious login engine (R1–R8)
├── email_alert.py # Gmail SMTP — all security notification emails
├── create_test_data.py # Seeds demo user and sample login history
├── requirements.txt
├── .env.example # Environment variable template
├── templates/
│ ├── base.html
│ ├── login.html
│ ├── register.html
│ ├── forgot_password.html
│ ├── verify_reset_otp.html
│ ├── reset_password.html
│ ├── verify_2fa.html
│ ├── dashboard.html
│ ├── login_history.html
│ ├── alerts.html
│ ├── profile.html
│ └── testing.html
└── tests/
└── test_app.py # 37 pytest tests
```
## 设置
### 1. 克隆并安装
```
git clone https://github.com/aungphonemyint412-prog/HackingDetectingSystemOfUnauthorizedLoginDevices.git
cd HackingDetectingSystemOfUnauthorizedLoginDevices
pip install -r requirements.txt
```
### 2. 配置环境
```
cp .env.example .env
```
编辑 `.env`:
```
SECRET_KEY=change-me-to-a-long-random-string
# Gmail SMTP(2FA、alerts 和所有通知邮件必需)
MAIL_USERNAME=your-gmail@gmail.com
MAIL_PASSWORD=your-16-char-app-password # Gmail App Password, not your login password
# Google OAuth(可选 — 启用“Sign in with Google”)
GOOGLE_CLIENT_ID=your_google_client_id_here
GOOGLE_CLIENT_SECRET=your_google_client_secret_here
```
**Gmail 应用密码:** 前往 [myaccount.google.com](https://myaccount.google.com) → 安全性 → 两步验证 → 应用密码。
**Google OAuth:** 在 [console.cloud.google.com](https://console.cloud.google.com) → APIs & Services → Credentials → OAuth 2.0 Client ID 创建凭据。将重定向 URI 设置为 `http://localhost:5000/login/google/authorized`。
### 3. 运行
```
python app.py
```
访问 [http://localhost:5000](http://localhost:5000)。
### 4. 演示数据(可选)
```
python create_test_data.py
# 创建:demouser / Password123
```
## 运行测试
```
python -m pytest tests/ -v
```
包含 37 项测试,涵盖注册、登录、2FA、检测规则 R1–R6、暴力破解警报、访问控制和 API endpoint。每个测试都使用一个全新的内存 SQLite 数据库。
## 安全流程
### 忘记密码
1. 在登录页面点击 **忘记密码?**
2. 输入您注册的电子邮件地址
3. 检查您的收件箱以获取 6 位数字重置验证码(有效期为 10 分钟)
4. 输入验证码,然后设置您的新密码
5. 如果账户已被锁定,将自动解锁
### “这是您吗?”警报响应
1. 检测到可疑登录 → 发送带有确认/拒绝按钮的警报电子邮件
2. **是的,这是我** → 登录被标记为已确认,无需其他操作
3. **不是,请保护我的账户** → 账户立即被锁定,并发送账户锁定电子邮件
4. 使用忘记密码功能重置密码并重新获得访问权限
### 账户锁定
- 在 `FAILED_ATTEMPT_WINDOW` 分钟内出现 `MAX_FAILED_ATTEMPTS` 次失败登录后触发
- 账户会在 `LOCKOUT_DURATION` 分钟后自动解锁
- 可以通过完成密码重置立即解锁
## 环境变量
| 变量 | 必填 | 描述 |
|----------|----------|-------------|
| `SECRET_KEY` | 是 | Flask session 签名密钥 |
| `MAIL_USERNAME` | 是 | 用于发送所有安全电子邮件的 Gmail 地址 |
| `MAIL_PASSWORD` | 是 | Gmail 应用密码(16 个字符) |
| `GOOGLE_CLIENT_ID` | 否 | 启用 Google OAuth 登录 |
| `GOOGLE_CLIENT_SECRET` | 否 | 启用 Google OAuth 登录 |
| `DATABASE_URL` | 否 | 默认为 `sqlite:///hacking_detection.db` |
标签:Flask, 双因素认证, 安全告警, 异常登录检测, 测试用例, 逆向工具