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安全, 后端开发, 安全教育, 漏洞演示, 蓝队分析