SQL注入原理及防护方案
SQL注入原理
SQL注入(SQL Injection)是一种通过向应用程序的输入字段中插入恶意SQL代码,从而操纵后端数据库的攻击方式。其核心原理是绕过应用程序的安全验证,直接与数据库交互,执行非授权的数据库操作(如数据窃取、篡改、删除等)。
攻击流程示例
- 输入点渗透:攻击者在表单输入框、URL参数等位置提交恶意代码。
sql
复制
' OR 1=1; --
- 代码拼接漏洞:应用程序未对输入进行过滤,直接将用户输入拼接到SQL语句中。
sql
复制
SELECT * FROM users WHERE username = '' OR 1=1; -- ' AND password = '123456';
- 数据库执行恶意代码:
--
是SQL注释符,导致原密码验证条件被绕过,攻击者无需密码即可登录。
常见攻击类型
- 布尔型注入:通过
1=1
、1=2
等逻辑判断探测数据。 - 联合查询注入:利用
UNION
合并查询结果窃取数据。 - 盲注(Blind Injection):通过时间延迟(如
SLEEP(5)
)或布尔逻辑推断数据。 - 堆叠查询注入:通过分号
;
执行多条SQL命令(如删除表)。
防护方案
1. 参数化查询(Prepared Statements)
原理:使用预编译的SQL语句,将用户输入作为参数绑定,避免代码拼接。
示例(Python + SQLite):
python
复制
# 危险代码(拼接字符串)
cursor.execute(f"SELECT * FROM users WHERE username = '{user_input}'")# 安全代码(参数化查询)
cursor.execute("SELECT * FROM users WHERE username = ?", (user_input,))
2. 输入验证与过滤
- 白名单验证:仅允许合法字符(如邮箱格式、数字)。
- 黑名单过滤:拦截常见攻击符号(如
'
、"
、;
、--
)。 - 转义特殊字符:对输入中的特殊字符进行转义(如
mysqli_real_escape_string()
)。
3. 最小权限原则
- 数据库用户仅授予必要权限(如禁用
DROP
、DELETE
)。 - 避免使用管理员账户连接数据库。
4. ORM框架
使用对象关系映射(ORM)工具(如Hibernate、SQLAlchemy),自动处理参数化查询,减少手写SQL的风险。
5. Web应用防火墙(WAF)
部署WAF拦截常见SQL注入攻击特征(如UNION SELECT
、1=1
)。
6. 错误信息隐藏
禁止向用户返回详细的数据库错误信息(如SQL Syntax Error
),防止攻击者获取数据库结构。
7. 定期安全测试
- 使用工具扫描漏洞(如sqlmap、OWASP ZAP)。
- 参考OWASP Top 10,持续更新防护策略。
总结
SQL注入的核心是输入未经校验直接拼接SQL,防护需从代码层(参数化查询)、权限层(最小权限)、架构层(WAF)多维度入手。开发中应始终遵循“不信任任何用户输入”的原则。