访问控制
MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少。
换句话说,用户不能对过多的数据具有过多的访问权。
考虑以下内容:
- 多数用户只需要对表进行读和写,但少数用户甚至需要能创建和删除表;
- 某些用户需要读表,但可能不需要更新表;
- 你可能想允许用户添加数据,但不允许他们删除数据;
- 某些用户(管理员)可能需要处理用户账号的权限,但多数用户不需要;
- 你可能想让用户通过存储过程访问数据,但不允许他们直接访问数据;
- 你可能想根据用户登录的地点限制对某些功能的访问。
这些都只是例子,但有助于说明一个重要的事实, 即你需要给用户
提供他们所需的访问权,且仅提供他们所需的访问权。 这就是所谓的访
问控制,管理访问控制需要创建和管理用户账号。
MySQL-管理用户
为了执行数据库操作,需要登录 MySQL。MySQL创建一个名为root的用户账号,它对整个MySQL服务器具有完全的控制。你可能已经在学习中使用root进行过登录,在对非现实的数据库试验MySQL时,这样做很好。不过在现实世界 的日常工作中,决不能使用root。应该创建一系列的账号,有的用于管 理,有的供用户使用,有的供开发人员使用,等等。
-- root用户是mysql超级管理用户,拥有的权限是最高的
-- 创建用户,分配权限
-- 创建 zhangsan 用户使用 234567 登陆mysql
create user zhangsan identified by '234567';
-- 给 zhangsan 用户分配一个 itxdl库中所有表的 select权限
grant select on itxdl.* to zhangsan;
-- 查看用户的权限
show grants for zhangsan;
-- 删除用户的指定权限
revoke delete on itxdl.stu from zhangsan;
-- 简写方式
grant select on itxdl.* to lisi@'%' identified by '111';
SQL注入
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
防护
归纳一下,主要有以下几点:
1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6.最好的方案进行SQL预处理:把sql和数据参数进行分离
具体操作
1,准备的sql语句中 使用 %s 或者 %(key)s 占位
2,在执行sql语句时,通过execute方法分别传递sql和参数(列表,元组,字典)