ssaraf990/secure-trading-auth-system

GitHub: ssaraf990/secure-trading-auth-system

一个以安全为核心的股票交易模拟平台,演示多层身份验证、CSRF防护、速率限制和审计日志等OWASP安全最佳实践。

Stars: 0 | Forks: 0

# 🔐 TradeSecure ### 一个安全的股票交易模拟平台 [![Python](https://img.shields.io/badge/Python-3.10+-3776AB?style=flat&logo=python&logoColor=white)](https://python.org) [![Flask](https://img.shields.io/badge/Flask-2.3-000000?style=flat&logo=flask&logoColor=white)](https://flask.palletsprojects.com) [![SQLite](https://img.shields.io/badge/SQLite-003B57?style=flat&logo=sqlite&logoColor=white)](https://sqlite.org) [![Security](https://img.shields.io/badge/Security-OWASP%20Aligned-red?style=flat)](https://owasp.org) [![License](https://img.shields.io/badge/License-MIT-green?style=flat)](LICENSE) *作为一个信息安全项目构建,演示了在实时股票交易平台上实现多层身份验证、暴力破解防护、CSRF 防御和安全交易授权。*
## 📌 概述 TradeSecure 是一个全栈 Web 应用程序,模拟了一个重点关注**应用层安全**的股票交易平台。它实现了 Zerodha 和 Groww 等真实交易平台使用的行业标准安全模式,包括多因素身份验证、交易 PIN (TPIN) 授权、速率限制、会话管理以及实时安全审计日志。 ## ✨ 功能 ### 🔐 安全层 | Feature | Description | |---|---| | **基于 Email OTP 的 2FA** | 密码登录后通过 Gmail SMTP 发送 TOTP 风格的 6 位 OTP | | **TPIN 授权** | 每次交易前需要单独的 6 位交易 PIN — 使用 bcrypt 哈希,仿照 Zerodha 的 CDSL TPIN 设计 | | **暴力破解防护** | 登录、OTP 和 TPIN 端点在 5 次失败后锁定 — 数据库记录 30–60 分钟的锁定 | | **速率限制** | 所有 API 端点上基于 IP 的滑动窗口速率限制器(无需外部库) | | **CSRF 保护** | 所有 POST 表单使用 Flask-WTF CSRF token;所有 JS `fetch()` 调用使用 `X-CSRFToken` header | | **会话超时** | 15 分钟不活动自动登出,带有实时倒计时器 | | **安全 Cookie** | `HttpOnly`, `SameSite=Lax` 会话 cookie 配置 | | **安全审计日志** | 每次身份验证尝试、交易、锁定和异常都记录到结构化 JSON 日志文件中,并提供实时应用内查看器 | ### 📈 交易功能 | Feature | Description | |---|---| | **实时股价** | 通过 `yfinance` 获取实时价格,Finnhub API 作为备用,模拟数据作为最终备用 | | **市价单与限价单** | 市价单以实时价格执行;限价单以用户指定价格执行 | | **搜索任何代码** | 不限于固定的监视列表 — 搜索 yfinance 支持的任何股票代码 | | **K 线图** | 仪表板上显示 30 天 OHLC K 线图 (Chart.js Financial + yfinance history) | | **投资组合 P&L** | 每项持仓的未实现盈亏及随时间变化的净值图表 | | **交易历史** | 完整的订单历史,包含订单类型、授权方式和金额 | ## 🏗️ 架构 ``` tradesecure/ ├── app.py # Main Flask application (routes, auth, security) ├── modules/ │ ├── stocks/ │ │ ├── stock_controller.py # yfinance + Finnhub price fetching, trade execution │ │ └── stock_routes.py # /api/stock/* Blueprint │ └── biometric/ │ ├── biometric_controller.py # WebAuthn challenge/response (mock) │ └── biometric_routes.py # /api/biometric/* Blueprint ├── security/ │ ├── security_logger.py # Structured JSON event logger │ └── threat_routes.py # /api/threats/* Blueprint ├── templates/ # Jinja2 HTML templates ├── security_logs/ # Auto-generated security event logs └── auth_system.db # SQLite database (auto-created) ``` ### 数据库表 ``` users — credentials, lock status, TPIN hash login_attempts — all auth attempts with IP + timestamp otps — time-limited OTP codes wallets — per-user INR balance positions — current stock holdings transactions — full trade history tpin_attempts — TPIN failure tracking for lockout portfolio_history — net worth snapshots for P&L graph watchlist — per-user symbol watchlist biometric_credentials — WebAuthn credential store ``` ## 🔒 安全设计决策 ### 为什么使用单独的 TPIN 而不是重用登录密码? 真实的交易平台 (Zerodha, Groww) 使用单独的交易 PIN,以便: 1. 仅泄露登录密码不足以执行交易 2. 交易授权因子可以独立进行速率限制和锁定 3. **深度防御** 原则 — 多个独立的屏障 ### 暴力破解防护如何工作 三个独立的锁定系统,各自独立跟踪: - **Login** — 15 分钟内 username+IP 失败 5 次 → 账户锁定 60 分钟 - **OTP** — 失败 5 次 → 账户锁定 60 分钟 - **TPIN** — 30 分钟内失败 5 次 → TPIN 锁定 30 分钟 ### CSRF 保护 所有更改状态的表单都包含由 Flask-WTF 生成的 `csrf_token` 隐藏输入。JavaScript `fetch()` 调用通过 `base.html` 中的 fetch wrapper 自动附加 `X-CSRFToken` header。JSON API 端点被明确豁免,因为它们依赖于会话身份验证。 ### 速率限制 自定义内存滑动窗口速率限制器(不需要 Redis)跟踪每个 IP 对每个端点的请求。限制:价格 API 30 请求/分钟,TPIN 验证 10 请求/分钟,市场数据 20 请求/分钟。 ## 🚀 入门指南 ### 前置条件 - Python 3.10+ - pip ### 安装 ``` # 克隆 repository git clone https://github.com/yourusername/tradesecure.git cd tradesecure # 安装 dependencies pip install -r requirements.txt # 设置 environment variables cp .env.example .env # 编辑 .env,填入你的 Gmail App Password 和随机 SECRET_KEY ``` ### 配置 (`.env`) ``` SECRET_KEY=your-long-random-secret-key EMAIL_ADDRESS=youremail@gmail.com EMAIL_PASSWORD=your-16-char-gmail-app-password DEV_PIN=123456 ``` ### 运行 ``` python app.py ``` 打开 [http://localhost:5001](http://localhost:5001) ### 首要步骤 1. 注册一个账户 2. 登录 — OTP 将发送到您的电子邮件(如果未配置电子邮件,则显示在终端中) 3. 转到导航栏中的 **TPIN** 并设置您的 6 位交易 PIN 4. 转到 **Trade** 并下您的第一个订单 ## 📸 截图 | Login + 2FA | Dashboard + Candlestick | Trade with TPIN | Security Audit Log | |---|---|---|---| | ![Login](https://raw.githubusercontent.com/ssaraf990/secure-trading-auth-system/main/docs/screenshots/login.png) | ![Dashboard](https://raw.githubusercontent.com/ssaraf990/secure-trading-auth-system/main/docs/screenshots/dashboard.png) | ![Trade](https://raw.githubusercontent.com/ssaraf990/secure-trading-auth-system/main/docs/screenshots/trade.png) | ![Audit](https://raw.githubusercontent.com/ssaraf990/secure-trading-auth-system/main/docs/screenshots/audit.png) | ## 🛠️ 技术栈 - **Backend**: Python, Flask, SQLite - **Auth**: Flask-WTF (CSRF), Werkzeug (password hashing), custom OTP + TPIN system - **Data**: yfinance (live stock prices), Finnhub API (fallback) - **Frontend**: Bootstrap 5, Chart.js + chartjs-chart-financial, Font Awesome - **Security Logging**: Custom structured JSON logger ## 📄 许可证 MIT License — 详见 [LICENSE](LICENSE)。
Built with Flask · Secured with OWASP principles · Live prices via yfinance
标签:2FA, CISA项目, CSRF防护, Flask, HTTPS, meg, OTP, Python, SQLite, TPIN, Web安全, yfinance, Zerodha, 交易密码, 会话管理, 信息安全, 双因素认证, 后端开发, 实时行情, 审计日志, 教育演示, 无后门, 登录保护, 网络安全项目, 股票模拟交易, 蓝队分析, 逆向工具, 金融科技, 防暴力破解