温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

数据库为何被注入

发布时间:2026-09-05 07:31:12 来源:亿速云 阅读:112 作者:小樊 栏目:数据库

“数据库被注入”通常指数据库遭受注入攻击(最典型的是 SQL 注入),本质原因是:程序把“用户传入的数据”当成了“可执行的数据库指令”来处理。

下面从原因、原理、常见场景、防护四个角度说明。


一、核心原因(为什么会被注入)

1. 用户输入未校验、未过滤

攻击者可以输入特殊字符(如 '、;、--、or 1=1):

用户名:admin' --
密码:随意

2. SQL 语句拼字符串(致命问题)

错误示例(Java / PHP 常见):

String sql = "SELECT * FROM user WHERE name='" + username + "' AND pwd='" + password + "'";

如果 username = admin' --
最终 SQL 变成:

SELECT * FROM user WHERE name='admin' -- ' AND pwd='xxx'

-- 注释掉后面内容,直接登录成功。


二、常见注入类型

1. SQL 注入(最常见)

  • 登录绕过
  • 拖库(获取全表数据)
  • 删表、写文件、提权

2. 盲注

  • 页面不报错,但可通过真假条件判断数据
  • 如:and 1=1 / and 1=2

3. 二阶注入

  • 恶意数据先存进数据库
  • 后续逻辑再拼 SQL 时触发

三、典型漏洞场景

场景 问题
登录框 拼接用户名密码
搜索框 直接拼 LIKE
订单 ID 直接拼 WHERE id=
后台接口 信任前端参数
老系统 无参数化、无 WAF

四、如何防止数据库被注入(重点)

✅ 1. 使用参数化查询(最有效)

Java:

PreparedStatement ps = conn.prepareStatement(
  "SELECT * FROM user WHERE name=? AND pwd=?");
ps.setString(1, username);
ps.setString(2, password);

MyBatis:

<select id="login">
  SELECT * FROM user WHERE name=#{name}
</select>

#{} 安全,${} 危险


✅ 2. 输入校验

  • 白名单(只允许字母数字)
  • 长度限制
  • 禁止特殊字符

✅ 3. 最小权限

  • 数据库账号不能是 root
  • 应用账号只给 SELECT/INSERT

✅ 4. 其他

  • 使用 ORM(MyBatis / Hibernate)
  • 上 WAF
  • 定期安全扫描
  • 不回显数据库错误给用户

一句话总结

数据库被注入,不是数据库的问题,而是“代码把用户输入当成了命令”。

如果你愿意,我可以:

  • 帮你看一段代码是否有注入风险
  • 用真实攻击示例演示
  • 按 Java / PHP / Python 给你防护模板
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手