SQL 注入:用户输入不是你想的那么简单

发布时间:2026-06-27 分类: 安全意识

一个搜索框,可能就是攻击入口

用户在搜索框输入关键词,系统拼接 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安全、信息安全意识