MySQL安全
目的
- 保护好MySQL主机及可访问数据库的主机的安全
- 确保MySQL资深安全,使用强密码,尽可能分配最小权限
- 确保网络安全,关注信息在生活中的保密
原则和注意事项
- 加强安全意识,加密办公电脑的重要数据,不要将未加密的文件直接存储在公共云存储中。
- 减少公共wi-fi或有线网的连接,涉及账号密码等都要避免输入注意泄露。
- 一般所有数据库都要部署于内网,异地多活跨IDC的数据库同步慎重对待。
- 开放外网访问的MySQL要有相应的访问策略,例如用防火墙控制来源IP、端口等
- 条件允许增加网络安全服务进行检查审计。
- 在不安全的环境中访问公司或者维护服务器建议用VPN。
- 不要让除root用户以外的任何用户可访问mysql系统库。
- 用GRANT和REVOKE控制权限,不要超过权限也不要为所有主机授权。
- 不要给程序账号(PHP/JSP等)授予SUPER权限。
- 生产库不要留研发人员账号。
- 隔离生产、开发、测试环境,不允许研发人员直接修改生产环境或知道生产环境账号密码。
- 使用Linux密码原则。
- 避免SQL注入,原则上不信任客户端输入的任何数据。
- 非管理员禁用FILE权限,防止infile load data等操作通过mysqld进程在文件系统中读写文件。
常见攻击方式
- 会话劫持
- 中间人攻击
- 跨站点脚本攻击
- SQL注入
SQL注入详解
在程序层输入字符串注入SQL语句,设计不强壮的程序忽略检查,被数据库误以为正常的SQL执行,攻击者可通过此方式破坏或盗取数据。
图中是就是传说中的车牌注入
SQL注入原理
-
拼接恶意查询
select * from users where user_id = $user_id;
如果$user_id = “1234;delete from users”
数据被恶意删除
-
注释执行非法命令
select * from users where class_id = $class_id and sex = ‘F’;
如果$user_id = “1234 OR 3 AND SLEEP(500) --”
那么 SQL 将会变成:
select * from users where class_id = 1234 OR 3 AND SLEEP(500) – and sex = ‘F’;
SQL将执行500秒返回数据,大大阻碍效率
-
单引号拼接
-
添加真值判断