ibernal1815/sql-security-lab

GitHub: ibernal1815/sql-security-lab

一个基于Flask和PostgreSQL的安全实验室,通过对比演示SQL注入攻击与防御并修复漏洞。

Stars: 0 | Forks: 0

# SQL安全实验 两个Flask应用,一个PostgreSQL数据库,一个疑问。当你跳过输入验证时,后果究竟会有多严重? 我创建这个实验,目的是将SQL注入从一个概念转化为可以实际演示、衡量和修复的问题。实验室同时运行同一应用的易受攻击版本和加固版本,这样差异就不再是理论上的。你可以亲眼目睹攻击如何成功,然后又如何失败。 ## 背景 / 我构建此项目的初衷 SQL注入数十年来一直稳居漏洞排行榜首。每门安全课程都会讲授它,但大多数时候你只在幻灯片中看到一个单行示例。我想要实际构建易受攻击的应用,亲自执行攻击,然后逐层加固。不仅仅是修补查询,而是像在真实环境中那样锁定数据库。 因此,我构建了两个版本。`vulnerable_app.py` 包含有缺陷的登录。`secure_app.py` 包含参数化查询、基于角色的访问控制、行级安全以及强制SSL连接。相同的模式,相同的数据,完全不同的安全姿态。 ## 项目功能 **阶段 1 — 易受攻击的应用** 一个由PostgreSQL支持的Flask登录表单,使用原始字符串拼接构建查询。一个经典的 `' OR TRUE --` 就能完全绕过身份验证。重点在于亲眼见证其工作原理,而不仅仅是阅读。 **阶段 2 — 数据库加固** 三个遵循最小权限原则的PostgreSQL角色:`app_user`、`app_reader`和`admin`。移除应用用户的超级用户权限。强制使用SCRAM-SHA-256身份验证。要求SSL连接。撤销默认权限。 **阶段 3 — 安全应用** 相同的登录流程,使用参数化查询和连接上下文中的正确角色重写。启用行级安全,使用户只能访问自己的行,无论查询如何编写。注入尝试将不返回任何数据。 **阶段 4 — 监控** 启用`pg_stat_statements`以跟踪两个应用的查询执行模式。有助于精确查看每个版本运行的查询以及攻击面所在。 ## 项目布局 ``` sql_security_lab/ ├── app/ │ ├── config.py │ ├── db.py │ └── seed.py ├── database/ │ ├── roles.sql │ ├── schema.sql │ └── seed_data.sql ├── scripts/ │ ├── start_postgres.sh │ └── init_db.sh ├── vulnerable_app.py ├── secure_app.py ├── requirements.txt └── .env ``` ## 设置说明 ``` git clone https://github.com/ibernal1815/sql-security-lab.git cd sql-security-lab python3 -m venv venv source venv/bin/activate sudo -u postgres psql -f database/roles.sql sudo -u postgres psql -f database/schema.sql sudo -u postgres psql -f database/seed_data.sql ``` 运行易受攻击的应用: ``` python vulnerable_app.py ``` 运行安全应用: ``` python secure_app.py ``` ## 技术栈 Python 3 · Flask · PostgreSQL · psycopg2 · pg_stat_statements
标签:API密钥检测, CISA项目, Flask, GitHub Advanced Security, PostgreSQL, RBAC, SSL, Web安全, 参数化查询, 安全加固, 安全实验室, 数据库监控, 最小权限, 测试用例, 漏洞演示, 网络安全, 蓝队分析, 行级安全, 角色管理, 认证安全, 输入验证, 隐私保护