数据库为什么是安全重灾区
应用的漏洞最终都会汇到数据库:数据库里存着用户密码、手机号、订单、身份证这些最敏感的数据。一旦被拖库,损失是直接且不可逆的。数据库安全不是单点功能,而是从输入、权限、存储、审计到备份的一整套防线。
本文核心知识点
- 注入用参数化查询从根上防。
- 权限账号只给必要的最小权限。
- 脱敏展示层掩掉敏感字段。
- 审计谁查了什么要可追溯。
SQL 注入与参数化查询
SQL 注入是把用户输入拼进 SQL 字符串,攻击者输入一段恶意 SQL 改变语句语义。根治办法永远是参数化查询(预编译):用户输入只当数据、不当代码,绝不拼接字符串。ORM 框架默认参数化,但要警惕手写 SQL、动态表名绕过。
// 危险:拼接字符串
"SELECT * FROM u WHERE name='" + name + "'"
// 安全:参数占位
db.query("SELECT * FROM u WHERE name=?", [name])
账号权限最小化
应用连库的账号别用 root,按业务给最小权限:只读账号只 SELECT、结算账号只动相关表。一个被攻破的应用账号,权限越小能造成的破坏越小。定期清理不再用的账号,密码定期轮换。
敏感数据脱敏
手机号、身份证、银行卡在展示时要脱敏:手机号显示 138****1234、身份证只留前后几位。脱敏在应用层或查询层做,别让前端拿到全量敏感数据。导出报表、测试环境更要脱敏,防止从旁路泄露。
审计与访问日志
开启数据库审计:谁、什么时间、从哪个 IP、执行了什么语句。出事时能追溯是哪条查询拖了库、是不是异常账号在批量导出。审计日志单独存放,别和业务库混在一起。
加密存储与传输
密码永远用 bcrypt、argon2 这类带盐的哈希,绝不能明文或可逆加密。传输走 TLS,别让数据库端口直接暴露公网。磁盘层可对敏感字段做加密,即使硬盘被拆走也读不出。
备份与恢复
安全再好也要有备份兜底:定时全量加增量备份,备份文件异地存放、定期演练恢复。很多"删库跑路"事件最后靠备份救场,备份没验证过等于没有。
落地清单
- 全部用参数化查询,绝不拼 SQL 字符串。
- 应用账号最小权限,定期清理轮换。
- 敏感字段展示脱敏、导出脱敏。
- 密码用 bcrypt/argon2,传输走 TLS。
- 开审计日志,备份定期演练恢复。