AwaisAli-05/sql-injection-demo

GitHub: AwaisAli-05/sql-injection-demo

通过对比脆弱登录系统与安全登录系统,直观演示 SQL 注入攻击原理及参数化查询防御方法的教学项目。

Stars: 1 | Forks: 0

# SQL 注入演示 这是一个关于 SQL 注入攻击及其防御方法的实践演示项目,使用 PHP、MySQL、HTML 和 CSS 构建。该项目直观地对比展示了**易受攻击**的登录系统与**安全**的登录系统之间的区别。 ## 什么是 SQL 注入? SQL 注入是最常见且最危险的 Web 漏洞之一(位列 **OWASP Top 10** 之中)。当用户输入未经处理直接拼接到 SQL 查询语句中时,就会发生这种情况——这使得攻击者能够操纵查询,从而绕过身份验证、窃取数据,甚至删除整个数据库。 ## 项目结构 ``` sql-injection-demo/ ├── index.html ← Login page (switch between vulnerable/secure mode) ├── login_vulnerable.php ← ❌ Unsafe backend (raw input in query) ├── login_secure.php ← ✅ Safe backend (prepared statements) ├── welcome.php ← Page shown after successful/bypassed login └── README.md ``` ## 配置说明 (XAMPP) **环境要求:** 已安装 XAMPP,并正在运行 Apache + MySQL **1. 克隆仓库** ``` git clone https://github.com/yourusername/sql-injection-demo ``` **2. 移动到 XAMPP 文件夹** ``` Copy the project folder to: C:\xampp\htdocs\sql-injection-demo\ ``` **3. 创建数据库** 打开 **phpMyAdmin** → `http://localhost/phpmyadmin` → 运行以下 SQL: ``` CREATE DATABASE sql_demo; USE sql_demo; CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, password VARCHAR(50) NOT NULL ); INSERT INTO users (username, password) VALUES ('admin', 'admin123'), ('awais', 'mypassword'), ('user1', 'pass123'); ``` **4. 运行项目** 打开浏览器并访问: ``` http://localhost/sql-injection-demo/index.html ``` ## 如何使用 ### 漏洞模式(默认) 表单会将数据发送到 `login_vulnerable.php` —— 原始输入会被直接拼接到 SQL 查询语句中。 在用户名字段中尝试以下攻击 payload: | Payload | 密码 | 结果 | |---|---|---| | `' OR '1'='1` | 任意 | 完全绕过登录 | | `admin'--` | 任意 | 忽略密码验证 | | `' OR 1=1--` | 任意 | 返回所有用户 | ### 安全模式 点击 **Secure** 按钮 —— 此时相同的 payload 将完全失效,因为 prepared statements 会将输入视为纯文本,而不是 SQL。 ## 攻击与防御 | | 漏洞版本 | 安全版本 | |---|---|---| | 输入处理 | 在查询字符串中直接使用原始 `$_POST` | 单独存储并绑定 | | 查询方式 | `$conn->query("... '$input'")` | `prepare()` + `bind_param()` | | 注入结果 | 绕过登录 | 输入被视为纯文本字面量 | | 修复方式 | 使用 prepared statements | 已实现 ✅ | ## 核心概念 **存在漏洞的查询:** ``` SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' ``` `'1'='1'` 始终为 TRUE → WHERE 条件永远成立 → 攻击者成功登录。 **安全的查询(prepared statement):** ``` SELECT * FROM users WHERE username = ? ``` `?` 占位符意味着输入会被**作为数据绑定**,而不会被解释为 SQL。注入字符串只会被当作普通用户名进行字面搜索——结果自然是什么也找不到。 ## 我学到了什么 - SQL 注入攻击在查询层面是如何运作的 - 为什么未经处理的输入是危险的 - prepared statements 和参数化查询如何防止注入 - PHP/MySQLi 中 `query()` 与 `prepare()` + `bind_param()` 的区别 - OWASP Top 10 漏洞分类 ## 技术栈 `PHP` `MySQL` `HTML5` `CSS3` `XAMPP` `Apache` ## 免责声明 ### 作者 Muhammad Awais ``` Cybersecurity Student React Frontend Developer ``` GitHub: https://github.com/AwaisAli-05 linkedin: https://www.linkedin.com/in/muhammad-awais-a48259328/
标签:CISA项目, OpenVAS, PHP, Web安全, 后端开发, 安全教育, 漏洞演示, 蓝队分析