mysql语句的注入错误是什么?


本文摘自PHP中文网,作者青灯夜游,侵删。

mysql语句的注入式错误就是利用某些数据库的外部接口将用户数据插入到实际的SQL语言当中,从而达到入侵数据库乃至操作系统的目的。攻击者利用它来读取、修改或者删除数据库内的数据,获得数据库中用户资料和密码等信息,更严重会获得管理员的权限。

(推荐教程:mysql视频教程)

sql注入式错误(SQL injection)

SQL Injection 就是利用某些数据库的外部接口将用户数据插入到实际的数据库操作语言(SQL)当中,从而达到入侵数据库乃至操作系统的目的。它的产生主要是由于程序对用户输入的数据没有进行严格的过滤,导致非法数据库查询语句的执行。
《深入浅出 MySQL》

危害
攻击者利用它来读取、修改或者删除数据库内的数据,获得数据库中用户资料和密码等信息,更严重的就是获得管理员的权限。

例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

//注入式错误

   public static void test3(String name,String passward){

       Connection connection = null;

       Statement st = null;

       ResultSet rs = null;

       try {

           // 加载JDBC 驱动

           Class.forName("com.mysql.jdbc.Driver");

           // 获得JDBC 连接

           String url = "jdbc:mysql://localhost:3306/tulun";

           connection = DriverManager.getConnection(url,"root","123456");

           //创建一个查询语句

           st = connection.createStatement();

           //sql语句

           String sql = "select * from student where name = '"+ name+"' and passward = '"+passward+"'";

           rs = st.executeQuery(sql);

 

           if(rs.next()){

               System.out.println("登录成功。");

           }else{

               System.out.println("登录失败。");

           }

 

       } catch (Exception e) {

           e.printStackTrace();

       }

   }

   public static void main(String[] args) {

       

       test3("wjm3' or '1 = 1","151515");

 

   }

数据库信息
在这里插入图片描述
如上面的代码所示,用户名为wjm3’ or '1 = 1,密码为151515,从数据库中可以看出我们没有这样的用户,本来应该显示登录失败,但是结果却是登陆成功,因为or '1 = 1 已经不是用户名里面的内容了,它现在为SQL 语句里面的内容,不论如何,结果都为true,等于不用输密码都可以登录。这里就产生了安全问题。

解决方法

1. PrepareStatement

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

//注入式错误

   public static void test3(String name,String passward){

       Connection connection = null;

       PreparedStatement st = null;

       ResultSet rs = null;

       try {

           // 加载JDBC 驱动

           Class.forName("com.mysql.jdbc.Driver");

           // 获得JDBC 连接

           String url = "jdbc:mysql://localhost:3306/tulun";

           connection = DriverManager.getConnection(url,"root","123456");

           //创建一个查询语句

           String sql1 =  "select * from student where name = ? and passward = ?";

           st = connection.prepareStatement(sql1);

          st.setString(1,name);

          st.setString(2,passward);

           //sql语句

           //String sql = "select * from student where name = '"+ name+"' and passward = '"+passward+"'";

           rs = st.executeQuery();

 

           if(rs.next()){

               System.out.println("登录成功。");

           }else{

               System.out.println("登录失败。");

           }

 

       } catch (Exception e) {

           e.printStackTrace();

       }finally{

           try {

               connection.close();

               st.close();

               rs.close();

           } catch (SQLException e) {

               e.printStackTrace();

           }

       }

   }

    public static void main(String[] args) {

       test3("wjm3' or '1 = 1","151515");

   }

上面这个代码不管name 参数是什么,它都只是name 参数,不会作为sql语句的一部分来执行,一般来说推荐这个方法,比较安全。
2.自己定义函数进行校验

  • 整理数据使之变得有效
  • 拒绝已知的非法输入
  • 只接受已知的合法输入

所以如果想要获得最好的安全状态,目前最好的解决办法就是对用户提交或者可能改变的数据进行简单分类,分别应用正则表达式来对用户提供的输入数据进行严格的检测和验证。
其实只需要过滤非法的符号组合就可以阻止已知形式的攻击,并且如果发现更新的攻击符号组合,也可以将这些符号组合增添进来,继续防范新的攻击。特别是空格符号和其产生相同作用的分隔关键字的符号,例如“/**/”,如果能成功过滤这种符号,那么有很多注入攻击将不能发生,并且同时也要过滤它们的十六进制表示“%XX”。

以上就是mysql语句的注入错误是什么?的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

关于django中mysql的charset配置

mysql不支持innodb的解决方法

mysql中utf8和utf8mb4编码有什么区别?

介绍mysql buffer pool里的change buffer

关于生产库中遇到mysql的子查询示例详解

通俗易懂讲解mysql数据库的增删改查

mysql存储引擎的分类

mysql大数据表水平分区优化的详细步骤

关于mysql的基础知识详解

mysql having用法是什么?

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...