什么是 SQL 注入 (SQLi)?
SQL 注入 (SQLi) 是一种攻击类型,攻击者在输入字段中输入恶意 SQL 语句以操纵数据库。
这种攻击针对未能正确处理验证和用户输入的应用程序,允许未经授权访问敏感数据,如密码或信用卡详细信息等。
SQL 注入如何工作
当应用程序在数据库查询中直接包含用户输入而没有进行适当验证时,攻击者可以修改查询的行为以输入恶意 SQL 语句。
例如:
SELECT * FROM users WHERE username = 'admin' AND password = '12345';
攻击者可能输入:
' OR '1'='1
导致:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
这总是返回真,从而授予未经授权的访问。
为什么 SQL 注入在网络安全中很重要
SQL 注入是网络安全中最危险和最古老的技术。这种类型的攻击始终列在 OWASP 前 10 名中。
即使是小的漏洞也允许攻击者:
- 访问、修改或删除数据
- 绕过身份验证
- 在数据库上执行管理操作。
- 危及整个系统。
常见的SQL注入类型
- 经典SQLi:通过网页表单或URL参数直接注入。
- 盲注SQLi:攻击者间接推断数据库信息(例如,通过错误消息或响应时间)。
- 联合SQLi:使用UNION操作符组合多个查询的结果。
- 错误基于SQLi:依赖于数据库错误消息提取信息。
- 基于时间的盲注SQLi:利用服务器响应延迟来猜测查询结果。
如何防止SQL注入
1. 使用参数化查询(预处理语句)
确保SQL命令将用户输入视为数据,而不是可执行代码。
cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
2. 输入验证和清理
验证所有用户输入,只允许预期的字符。
3. 使用ORM框架
像Prisma、Hibernate等框架减少直接处理SQL。
4. 最小权限原则
限制用户权限,只给予所需的权限。
5. 定期安全测试
使用应用程序安全测试工具,如SAST、DAST或IAST,以便及早检测注入漏洞。
现实世界中的例子
一家在线商店网站遭遇了攻击,攻击者在登录表单中使用SQL注入来从其数据库中提取信用卡信息。