从开发的角度来对数据库的数据安全做几点总结。
-
问题:线上数据被篡改。
描述:维护人员或系统配置的人员是有数据库相关权限的,受利益驱使,可能会更改自己账号的数据或有外部用户通过金钱交易以求更改数据。
方案:防人之心不可无,权限首先要限制在最小范围。从开发角度,我们对敏感数据都增加校验值字段,在代码中不论是增加、删除还是更新都首先根据相应的数据字段计算校验值,与原校验值进行比对,如果不吻合则操作失败,记录日志及报警。 -
问题:同一订单重复插入。
描述:并发操作,系统繁忙造成本来非同时的操作堵塞后同时对数据库操作,或者用户使作弊程序瞬间发送大量操作命令,导致同一订单重复插入了。
解决:程序上首先对瞬间的大量操作做了防范,但后来发现系统繁忙时仍然会出现重复插入的问题。究其原因,设计时数据表的订单字段不是主键,只是普通的字段,后来将数据库订单字段设置为唯一索引后避免了此问题的再度发生。 -
对于上述问题的补充:
即使做了上述“补丁”,还是不能掉以轻心认为万事大吉,还需要及时发现及时处理,因此制定计划任务:- 每日对关键数据做核对,比如用户的充值、消费与剩余值应该满足sum(充值)-sum(消费)=剩余值的关系,如果不平衡则需要报警人工查验。
- 每日对异常操作进行监测报警,比如充值/消费的总额过高、次数过多或频度过繁等现象如果发生,则及时报警,再由人工分析是否是正常的操作还是系统漏洞。