一.前言
本章来介绍sql注入基础的最后部分了,来和大家介绍一下mysql版本区别还有sql注入防护,等讲完网络安全基础部分再来和大家介绍一下sql注入的进阶了,期待大家点赞关注加收藏
二.MySQL的版本区别
mysql5.0以及5.0以上的版本都存在一个系统自带的系统数据库,叫做:information_schema,
mysql5.0以下没有information_schema库,只能通过暴力猜解的方式来获取数据,
information_schema库里面包含了很多表,其中这几张表:schemata、tables、columns,这三张表依 次分别存放着字段:(schema_name-库名)、(table_name-表名、table_schema-库名)、(table_schema-库名、table_name-表名、column_name-字段名),其次就是5.0以上都是多用户多操 作,5.0以下是多用户单操作。
mysql5.7和mysql8的区别: 先作为了解。
创建用户和授权:
mysql5.7可以一句话搞定:
grant all privileges on *.* 'user'@'%' identified by '123456';
mysql8必须分开做:
create user 'user'@'%' identified by '123456';
grant all privileges on *.* to 'user'@'%';
table函数
table函数为MYSQL8版本中新增的函数,其作用与select类似。
table users; 等同于:select * from users;
但是table查询时,显示的始终是表的所有列,而且不可以用where字句来限定某个特定的行。
values函数:
select * from user union VALUES ROW(2,3); 等同于select * from user union select 2,3;
如图:
三.sql注入防护
所有的数据库防护手段基本都是一样的,就是对用户提交的数据做严格的过滤。
方式
1、对提交的数据进行数据类型判断,比如id值必须是数字:is_numeric( $id )
2、对提交的数据进行正则匹配,禁止出现注入语句,比如union、or、and等
3、对提交数据进行特殊符号转义,比如单引号、双引号等,用addslashs等函数加工一下
4、不使用sql语句拼接参数的方式来执行sql语句,而是用参数化查询,也叫做参数绑定的方式,对提交的参 数进行预编译然后进行参数绑定,这样会将用户提交的注入语句作为参数值来处理,而不是当作sql语句执 行,这样可以有效的方法sql注入:不同语言的写法不同,但是原理相同。
$data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
$data->bindParam( ':id', $id, PDO::PARAM_INT );
$data->execute();
但是预编译也不能完全解决sql注入问题,比如如果查询语句中表名是动态的,也就是说表名也是用户可 以提交过来的数据,根据用户提交的表名来进行不同表数据的查询,那么也会出现sql注入漏洞,因为表名不 能进行预编译及参数绑定,下面就报错
$table_name='xxxx';
$data = $db->prepare( 'SELECT first_name, last_name FROM (:table_name) WHERE user_id = (:id) LIMIT 1;' );
这种就需要配合白名单进行过滤:
if ($table_name == 'xxxx'){
$data = $db->prepare( 'SELECT first_name, last_name FROM xxxx WHERE user_id = (:id) LIMIT 1;' );
}elif ($table_name == 'yyyy'){
$data = $db->prepare( 'SELECT first_name, last_name FROM zzzz WHERE user_id = (:id) LIMIT 1;' );
}else{
echo '别乱搞!';
}
5、分级管理:用户的权限要进行严格控制和划分,服务端代码连接数据库使用的用户禁止使用root等高权限 用户。比如对用户进行分级管理,严格控制用户的权限,对于普通用户,禁止给予数据库建立、删除、修改等 相关权限,只有系统管理员才具有增、删、改、查的权限等等。
6、数据库中敏感的数据,比如用户的密码,要加密存储。
总体来说:
(1)永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对特殊 字符和符号进行转换等。
(2)永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。
(3)永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
(4)不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。
(5)应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装, 把异常信息存放在独立的表中。
四.总结
sql注入基础的有关内容就说这么多了,期待大家的点赞关注加收藏,我与你们一直同在!