一个搜索框,可能就是攻击入口
用户在搜索框输入关键词,系统拼接 SQL 查询数据库。
如果用户输入的不是关键词,而是 SQL 代码呢?
什么是 SQL 注入?
简单解释
SQL 注入 = 攻击者通过用户输入,注入恶意 SQL 代码,操控数据库。
攻击示例
正常查询:
SELECT * FROM users WHERE name = '张三'
SQL 注入:
用户输入:' OR '1'='1
拼接后的 SQL:
SELECT * FROM users WHERE name = '' OR '1'='1'
结果: 返回所有用户数据。
SQL 注入的 3 种攻击方式
方式一:绕过认证
场景: 登录页面的 SQL 注入。
攻击: 输入 ' OR '1'='1' -- 作为用户名。
结果: 绕过登录验证,直接进入系统。
方式二:窃取数据
场景: 搜索功能的 SQL 注入。
攻击: 使用 UNION SELECT 语句,从其他表中读取数据。
结果: 窃取用户密码、个人信息、财务数据。
方式三:修改/删除数据
场景: 任何接受用户输入的 SQL 查询。
攻击: 使用 UPDATE 或 DELETE 语句。
结果: 修改或删除数据库中的数据。
SQL 注入的危害
| 危害 | 描述 |
|---|---|
| 数据泄露 | 窃取用户数据、商业机密 |
| 数据篡改 | 修改数据,影响业务 |
| 数据删除 | 删除数据,造成业务中断 |
| 系统控制 | 获取数据库管理员权限 |
| 横向渗透 | 通过数据库访问内网 |
如何防范 SQL 注入?
1. 使用参数化查询
错误(字符串拼接):
query = "SELECT * FROM users WHERE name = '" + name + "'"
正确(参数化查询):
query = "SELECT * FROM users WHERE name = ?"
cursor.execute(query, (name,))
2. 使用 ORM 框架
- Django ORM
- SQLAlchemy
- Hibernate
- MyBatis(使用
#{}而不是${})
ORM 框架默认使用参数化查询,有效防止 SQL 注入。
3. 输入校验
- 检查用户输入的格式
- 过滤特殊字符
- 限制输入长度
4. 最小权限原则
- 数据库用户只授予必要权限
- 不使用管理员账号连接数据库
- 限制 SELECT、INSERT、UPDATE、DELETE 权限
5. Web 应用防火墙(WAF)
- 部署 WAF,拦截 SQL 注入攻击
- WAF 可以检测常见的注入模式
- 但 WAF 不是万能的,代码层面防护更重要
一句话总结
SQL 注入 = 用户输入变成了 SQL 代码。防范方法:参数化查询、ORM 框架、输入校验、最小权限。
标签: 开发安全、SQL注入、Web安全、信息安全意识