SQL注入攻击原理以及解决

所有我个人认为这算是微软 sql2012 的bug。

1.导入jar包,可以在网上下载到,这里使用的是:mysql-connector-java-5.1.37-bin.jar

永利皇宫登录网址 1

5.处理结果

如果我们换成 order by store_Number ,两段sql语句的分页都是正常的。

驱动程序类库,实现接口重写方法,由驱动程序操作数据库

永利皇宫登录网址 2

4.执行sql语句:

 

4.执行sql语句

DECLARE  @FetchRows tinyint = 8;SELECT * FROM BnC_Store ORDER BY Created_Date ASC   OFFSET 0 ROWS   FETCH NEXT @FetchRows ROWS ONLY;SELECT * FROM BnC_Store ORDER BY Created_Date ASC   OFFSET 8 ROWS   FETCH NEXT @FetchRows ROWS ONLY;SELECT * FROM BnC_Store ORDER BY Created_Date ASC   OFFSET 16 ROWS  FETCH NEXT @FetchRows ROWS ONLY;

 

select * from BnC_Store order by Created_Date asc OFFSET 0 ROWS FETCH NEXT 8 ROWS ONLY;select * from BnC_Store order by Created_Date asc OFFSET 8 ROWS FETCH NEXT 8 ROWS ONLY;select * from BnC_Store order by Created_Date asc OFFSET 16 ROWS FETCH NEXT 8 ROWS ONLY;

3.获取语句执行平台

 

 

下面有两段sql语句 ,数据中Create_Date 的值都一样

JDBC本质是一套API,由开发公司定义的类和接口

第二,三个分页的数据和第一个分页的前5条数据是一样的。分页不正常。 

 

后来跟了下sql语句,发现用到是sql2012的新分页方式 OFFSET/FETCH NEXT。 

package demo;

import java.sql.DriverManager;
import java.sql.SQLException;

import com.mysql.jdbc.Driver;

public class JDBCDemo {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        //注册驱动
        //DriverManager.registerDriver(new Driver());
        //不推荐上边这种方法,建议用反射技术,将驱动类加入内存
        Class.forName("com.mysql.jdbc.Driver");
    }
}

 

 

上个星期,测试发现了一个分页的bug—
无论怎么分页数据的一样。我们所有的分页都是用EF
分页,为什么只有一个模块的分页有问题呢?

准备数据:

分页是正常的。 

1.注册驱动

这里如果这样输入:
永利皇宫登录网址 3

永利皇宫登录网址 4

package demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCDemo {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        //获得数据库连接
        String url = "jdbc:mysql://localhost:3306/mybase";
        String username = "root";
        String password = "xuyiqing";
        Connection con = DriverManager.getConnection(url,username,password);
        System.out.println(con);
    }
}
package demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCDemo {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mybase";
        String username = "root";
        String password = "xuyiqing";
        Connection con = DriverManager.getConnection(url,username,password);
        //获取语句执行平台
        Statement stat = con.createStatement();
        System.out.println(stat);
    }
}

永利皇宫登录网址 5

注册驱动:

package demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;

/*
 *  Java程序实现用户登录,用户名和密码,数据库检查
 *  防止注入攻击
 *  Statement接口实现类,作用执行SQL语句,返回结果集
 *  有一个子接口PreparedStatement  (SQL预编译存储,多次高效的执行SQL) 
 *  PreparedStatement的实现类数据库的驱动中,如何获取接口的实现类
 *  
 *  是Connection数据库连接对象的方法
 *  PreparedStatement prepareStatement(String sql) 

 */
public class JDBCDemo {
    public static void main(String[] args)throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mybase";
        String username = "root";
        String password = "xuyiqing";
        Connection con = DriverManager.getConnection(url, username, password);
        Scanner sc = new Scanner(System.in);
        String user = sc.nextLine();
        String pass = sc.nextLine();

        //执行SQL语句,数据表,查询用户名和密码,如果存在,登录成功,不存在登录失败
        String sql = "SELECT * FROM users WHERE username=? AND PASSWORD=?";
        //调用Connection接口的方法prepareStatement,获取PrepareStatement接口的实现类
        //方法中参数,SQL语句中的参数全部采用问号占位符
        PreparedStatement pst =  con.prepareStatement(sql);
        System.out.println(pst);
        //调用pst对象set方法,设置问号占位符上的参数
        pst.setObject(1, user);
        pst.setObject(2, pass);

        //调用方法,执行SQL,获取结果集
        ResultSet rs = pst.executeQuery();
        while(rs.next()){
            System.out.println(rs.getString("username")+"   "+rs.getString("password"));
        }

        rs.close();
        pst.close();
        con.close();
    }
}

2.获得连接:

package demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCDemo {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mybase";
        String username = "root";
        String password = "xuyiqing";
        Connection con = DriverManager.getConnection(url,username,password);
        Statement stat = con.createStatement();
        //执行sql语句
        //这种方法注意:只能使用insert,delete,update语句
        int row = stat.executeUpdate("INSERT INTO sort(sname,sprice,sdesc) VALUES('汽车',2000,'促销');");
        System.out.println(row);
        //释放资源
        stat.close();
        con.close();
    }
}

执行sql语句:

SQL注入攻击简单案例:

 

永利皇宫登录网址 ,3.获得语句执行平台

使用PrepareStatement接口

网站地图xml地图