网络游戏虽然不是一个以数据库为中心的系统,但是和其他的应用一样,数据库中保存着和玩家以及运营商密切相关的重要数据,比如帐号、装备等重要信息,以及游戏运营的数据。这些数据被盗取或者篡改将会严重影响到一个游戏的运营。
这里从游戏服务器端开发的角度来分析一下对于游戏的数据库来说,安全性方面可以注意的地方。
游戏数据库一般分为游戏世界和玩家角色数据库,以及登录数据库。
一般来说游戏世界和玩家相关的数据库在每个游戏服务器组都有一套,一般放在游戏服务器的后端;登录数据库根据运营方式不同,有的会和注册服务器在一起,独立为一个数据库,同时为应用服务器和Web注册服务器提供服务。
这样,数据库被暴露在不同的地方,攻击者可以通过不同的方式进行攻击,直观的说有这样几种:
1、通过外挂等方式以客户端为借体进行攻击,实际通过执行服务器端的逻辑间接执行数据库操作。
2、Web注册服务器进行攻击。
3、直接连接数据库进行攻击。
4、模拟网络数据包发送请求。
这些攻击方式是可以自顶向上全方位进行的。
我们作为服务器开发人员,也要对数据库进行全方位的防护。
这里列出一些我能想到的数据库防护措施。
1、游戏服务器逻辑层校验
在游戏服务器端对客户端发送过来的操作在服务器端根据服务器端的数据和规则进行校验,对于不符合逻辑的活动做合理的处理。这样能从逻辑上防止客户端有人使用外挂对服务器端进行作弊,间接通过服务器逻辑操作数据库数据。
2、网络数据包的安全性
对网络数据包本身进行加密
对发送的数据包进行校验保证数据包的完整性,比如对每个包都带上校验段;
对网络包信息的发送来源进行验证,比如每个网络数据包都要直到发送者的唯一识别码,这个在用户验证的时候可以提供。
3、前端服务器过滤SQL操作
经典的SQL注入,就是在字符串中加入一些SQL语句,改变原来SQL的操作,对数据库进行非法操作。
还有一些SQL语句,比如一些数据库的内置函数,通过这些内置函数可以让操作者获得管理员权限。
这些操作我们应该在服务器的前端就避免掉,常见的就是对SQL字符串中的字符进行转义,防止SQL注入。
在前端过滤一些特殊的SQL语句,让这些操作根本无法影响数据库服务器。
4、软件架构上的隔离
从服务器软件架构设计上将数据库隔离出来,在数据库的上层设计一个DBI层,将对数据库的所有操作通过DBI来访问,减少了可能的风险来源。
5、网络层面的隔离
将数据库层放到网络的后端,比如注册服务器暴露在外网,但是将和注册服务器相连的DB服务器放到防火墙内,只和注册服务器相连,不直接暴露到外网环境里。
6、数据库访问来源限制
一般的数据库都可以设置访问来源,比如限制IP或者网段等
7、数据库认证方式
一般的数据库支持多种认证方式,比如密码认证、操作系统认证、密钥认证等,有的还甚至支持生物特征认证等。
选择一种自己认为最新人的认证方式。
比如有的人喜欢把用数据库的用户名密码写在一个配置文件里,然后访问数据库的时候通过这个配置文件里的用户名密码来访问。这样显然不够安全,一旦有人通过各种方式看到用户名密码,那数据库就处于一个很危险的状态。这种使用密码的方式就不太安全。
如果使用密码,一定要记住用复杂密码哦。
8、数据库授权
不要将生产数据库的用户设置为管理员权限,只给他设置他需要访问的权限。
首先是可以作哪些系统操作,比如创建删除用户,删除数据库等这些高级又危险的权限,先拿掉。
然后对每个表的操作,严格的分配其CREATE,DROP,ALTER,SELECT等权限,只给其分配其需要的权限。
然后对数据的权限,有的数据库支持到列的权限,那么就可以对其对那些表和列等数据进行访问进行限定。
9、使用视图、存储过程、函数等隔离数据库操作
使用视图可以从数据库的逻辑上隔离数据库的操作,将一个不需要访问的数据从逻辑上屏蔽掉。
视图的另外的好处还有,在不修改表结构的情况下,对不同的用户提供不同的视图。
存储过程和函数等同样可以起到隔离数据的作用,通过提供有限的结构,将大部分对数据库本身的操作屏蔽在外面。
10、数据库的日志审计等
将对数据库的操作进行日志和审计操作,并对不合法的数据进行报警。
管理员可以在事后对数据库操作进行检查,及时发现问题并进行弥补。
11、数据库配置项
数据库一般都有各种复杂的配置项,使用他们可以防止对数据库进行一些防护。
比如设置单个用户重连失败的次数以及失败后的处理方式。避免对密码进行穷举破解。
比如设置合适的数据库链接失败次数避免故意的恶意连接导致数据库拒绝服务。
12、数据库备份
及时对数据库进行定期备份,防止数据库被破坏后可以进行恢复。
一般比如在晚上凌晨对数据库定期全备份。
对于Oracle等数据库,有高级复制,DataGuard等
在数据库的使用中保留一定的数据冗余是必要的
13、集群、镜像等
将数据库作镜像,比如有一个镜像磁盘,或者镜像服务器等保证数据的安全性。
对数据库进行集群保证数据库运行的效率和反应速度,不会因为大量的数据访问而被拖垮。
14、数据加密
将一些数据,比如密码等加密变成密文保存。
这样,即使数据丢失也不一定被破解。
这些是我个人的一些粗浅的总结,希望大家能补充。