SQL注入10----(MySQL的版本区别和SQL注入防护)

SQL注入10----(MySQL的版本区别和SQL注入防护)

一.前言

本章来介绍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注入基础的有关内容就说这么多了,期待大家的点赞关注加收藏,我与你们一直同在!

转载请说明出处内容投诉
CSS教程网 » SQL注入10----(MySQL的版本区别和SQL注入防护)

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买