sql注入详解

sql注入概述

  所谓sql注入就是,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器的恶意SQL命令。当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。

案例

  这是我们最先开始设计的一个学生表,我们使用这个案列来实现各种非正常情况的查询来查询出用户信息。在下面的代码中会有每种查询对应的查询语句。
在这里插入图片描述  1.首先我们通过用户输入用户名和密码然后获得用户的相关信息,我们可以发写一些现象,代码如下:为了是我们发现我们的SQL语句最终变成什么样子。

package org.westos.dao;

import org.westos.utils.JDBCUtils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

public class SqlInject {
    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
        Integer StudentNo = null;
        String password = null;
        String StudentName = null;

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要查询的学生的学号");
        String i = scanner.nextLine();
        System.out.println("请输入你的用户密码");
        Scanner scanner1 = new Scanner(System.in);
         password = scanner1.nextLine();
        try {

            connection = JDBCUtils.getConnection();
            statement = connection.createStatement();
            String sql = "SELECT * FROM student where StudentNo = '"+i+"'and LoginPwd='"+password+"'";
            System.out.println(sql);
            resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {
                System.out.println(resultSet.getString(1));
                System.out.println(resultSet.getString(2));
                System.out.println(resultSet.getString(3));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {

        }
    }
}

输出框:
第一种:使用用户名为’ or 1=1 #,用户使用任意密码输入

请输入你要查询的学生的学号
' or 1=1 #
请输入你的用户密码
3r423
SELECT * FROM student where StudentNo = '' or 1=1 #'and LoginPwd='3r423'
1000
111111
郭靖
1001
123456
李文才
1002
111111
李斯文
1003
123456
武松
1005

第二种:正确学号,任意密码:

请输入你要查询的学生的学号
1001
请输入你的用户密码
dfh'or' 1=1
SELECT * FROM student where StudentNo = '1001'and LoginPwd='dfh'or' 1=1'
1000
111111
郭靖
1001
123456
李文才
1002
111111
李斯文
1003
123456
武松
1005
123456
张秋丽 
1006

第三种方法,任意账号,任意密码

请输入你要查询的学生的学号
'or 1=1 or'
请输入你的用户密码
dfhjk' or 1=1 or'
SELECT * FROM student where StudentNo = ''or 1=1 or''and LoginPwd='dfhjk' or 1=1 or''
1000
111111
郭靖
1001
123456
李文才
1002
111111
李斯文
1003
123456
武松

1.第一种我们使用用户名为’ or 1=1 #,用户使用任意密码输入,程序中的SQL语句为:
SELECT * FROM student where StudentNo = ‘’ or 1=1 #‘and LoginPwd=‘3r423’;
因为#在SQL语言中是注释符,因此将密码的校验就注释掉了, 查询条件就成为就等价于SELECT * FROM student where StudentNo = ‘’ or 1=1;因此SQL注入成功。
2.使用正确用户名和任意密码来实现SQL注入程序中的SQL语句就变成了
SELECT * FROM student where StudentNo = ‘1001’and LoginPwd=‘dfh’or’ 1=1’;,因此校验密码就成了LoginPwd=‘dfh’or’ 1=1’,这样显然是任何密码都是正确的。
3.使用任意的账户和密码来进行登陆,程序中的SQL语句就变成了SELECT * FROM student where StudentNo = ‘‘or 1=1 or’‘and LoginPwd=‘dfhjk’ or 1=1 or’’;在这种情况下,用户密码和账户都不用输入正确就可以获得相关信息。

总结

  从上面的代码中我们不难看出SQL注入的原理,SQL注入就是使用了大量的拼接字符串,来达到一种绕过正常方法特殊查询,主要就是进行字符串拼接使得SQL语句的条件为真或者注销的SQL语句。那么有没有一种方法可以防止这样的情况发生了,那么我们就要了解预编译了即就是statement和prepareStatement的区别以及用法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值