数据库集中保存身份、交易、医疗、业务规则和审计证据,一次越权查询可能批量泄露信息,一次错误更新也可能让整个业务失去可信基础。数据库安全必须同时保护机密性、完整性、可用性与可追责性,并覆盖应用、数据库引擎、操作系统、备份和密钥。

完成本章后,你应该能够设计角色、视图、行列级策略与授权传播规则;解释 SQL 注入的根因并使用参数化查询;识别推理与聚合泄露;运用约束、事务、审计、加密、备份与恢复建立纵深防御。
关系数据库把数据组织为关系、元组和属性。安全对象不只是一张表,还可能是视图、列、行、存储过程、函数、序列、模式和备份。主体则包括最终用户、应用服务账号、管理员、作业和外部服务。
自主访问控制由对象所有者或被授权者授予与回收权限。常见操作包括查询、新增、修改、删除、引用与结构变更。权限可以直接授给用户,也可汇总为角色再分配给人员。角色降低管理成本,但角色成员、继承关系和临时授权必须持续复核。
最小权限要求应用账号只拥有完成当前任务所需的权限。报表服务通常只需查询视图,不应删除基础表;写入订单的服务不应修改用户角色;迁移账号只在变更窗口启用。职责分离则避免一人同时发起、批准并掩盖高风险操作。
授权若带有继续授权能力,会形成传播链。回收上游授权时,需要明确依赖授权是级联撤销还是阻止撤销,否则可能留下孤立权限或意外中断业务。
视图可以只暴露被允许的列和行,例如隐藏身份证号并只呈现汇总结果。列级权限控制敏感字段,行级安全根据租户、所有者、部门或业务状态自动追加过滤条件。多租户系统应在数据库侧再次强制租户隔离,不能只依赖前端传入租户编号。
上下文授权还可考虑连接来源、设备、时间、数据标签和审批状态。策略必须同时约束读取与写入:只限制查询却允许更新,仍可能通过错误信息、约束差异或写入副作用泄露数据。策略函数应简单、稳定、可测试,并防止拥有绕过权限的高权账号成为日常应用账号。
SQL 注入的根因是应用把不可信输入拼进 SQL 语法,使数据被数据库解释成操作符、子查询或额外语句。攻击结果可能包括绕过认证、联合读取、利用布尔或时间差逐位推断、借错误回显泄露结构,以及在权限允许时修改或删除数据。

参数化查询把 SQL 模板与参数分别交给驱动,数据库解析语法后再绑定数据。参数中的引号和运算符不再改变语法树。这是主要防线;输入验证用于业务格式约束,最小权限限制成功注入后的损害,统一错误处理减少信息泄露,监控和防火墙只能作为补充。
参数不能替代标识符。动态表名、列名或排序方向应从固定允许列表映射,不能把用户输入直接拼接。存储过程若内部继续拼字符串,同样可能注入。
推理是通过获准查询与已知背景知识推出未获准信息。直接推理可能从依赖关系得出敏感属性;间接推理则组合多次结果。例如先查询部门总人数,再逐步增加地区、职级条件,当集合缩小到一人时,其平均薪资就等于个人薪资。

防护可以在设计期消除危险依赖、拆分关系或调整授权,也可在查询时分析当前查询与历史结果。统计数据库常使用最小查询集、限制集合重叠、抑制小计数、限制高精度结果、抽样、扰动数据或输出噪声。差分隐私通过隐私预算约束多次查询的累计泄露,但参数和组合规则必须正确。
实体完整性以非空唯一主键标识记录;参照完整性用外键保持关系;域完整性用类型、非空、唯一、检查约束和默认值限制取值;业务完整性还可能需要事务、触发器或受控过程。
事务的原子性避免只完成一半操作,一致性要求事务前后满足约束,隔离性控制并发可见性,持久性保证已提交结果在故障后保留。隔离级别过低可能产生脏读、不可重复读、幻读或丢失更新;关键余额更新应使用数据库原子操作、锁或乐观版本检查。
约束是最后一道防线,但不能替代授权。拥有结构变更或绕过约束能力的账号必须严格限制,关键规则还需测试迁移、批处理和恢复路径。
审计应记录谁在何时从何处执行了什么操作、作用于哪些对象、结果是否成功,以及授权和结构如何变化。高价值事件包括登录失败、批量导出、敏感列读取、权限变更、模式变更、审计配置变更和备份操作。
日志本身是敏感资产:应限制访问,发送到独立位置,使用追加写、完整性校验和可靠时间源,并设定保存与隐私策略。记录参数时要避免把口令、密钥或完整敏感数据再次泄露到日志中。告警需要基线和上下文,否则海量记录无法转化为检测能力。
传输加密保护客户端到数据库的链路;全盘或透明加密主要保护离线介质;列级或应用层加密能对特定字段实施更细控制。层次越低越透明,但运行中的高权进程通常能看到明文;层次越高控制越细,却增加查询、索引、轮换和开发复杂度。
加密会影响排序、范围查询、去重和索引。确定性加密可支持等值匹配,却泄露重复模式;把密钥与数据库文件放在同一权限边界,会削弱失窃保护。密钥应独立保管、限制导出、按用途分离并支持版本化轮换。备份、日志、临时文件和副本同样要纳入加密范围。
备份不是简单复制文件。方案需定义恢复点目标与恢复时间目标,组合全量、增量和事务日志,保留离线或不可变副本,并把密钥、模式版本和恢复步骤一起管理。仅有备份而未演练恢复,不能证明可用性。

恢复时应在隔离环境验证备份完整性,恢复模式与数据,再重放日志到目标时间点,校验行数、约束、关键业务指标和应用连接。勒索软件场景还需确认备份账号未与生产账号共用,并防止在线备份被同步删除。
我们在沙盒环境中的临时 SQLite 数据库中建立用户和订单表,启用外键并设置 amount > 0 检查约束。对输入 admin' OR '1'='1 分别执行字符串拼接和参数化查询,再修改金额并从备份恢复。真实输出如下:
unsafe_rows= [('admin',), ('alice',)]
parameterized_rows= []
integrity_error= IntegrityError: CHECK constraint failed: amount>0
changed_amount= 900
restored_amount= 100
backup_sha256= 9f8ce44e5faca888284800ca6d60956ccb119b32e41fd31b8bc9dbfdb227b1f7
restored_sha256= 9f8ce44e5faca888284800ca6d60956ccb119b32e41fd31b8bc9dbfdb227b1f7
hash_equal= True拼接查询把输入解释成恒真条件,返回两名用户;参数化查询把整段输入当普通用户名,返回空集合。负金额被数据库约束拒绝。备份恢复后金额从 900 回到 100,恢复文件与备份 SHA-256 完全一致。
数据库安全是一组协同控制:身份与最小权限限制入口,视图和行列策略缩小可见范围,参数化查询守住代码与数据边界,查询限制和扰动降低推理泄露,约束与事务维护一致性,审计提供证据,加密保护特定暴露面,备份与演练保证恢复。
最稳健的设计会把这些措施映射到清楚的资产、威胁和失败场景,并持续测试授权、查询、恢复和密钥轮换,而不是把安全寄托在单一管理员口令或单一加密开关上。