Problema de precompilación de JDBC e inyección de sql de las notas de estudio de javaweb

¿Qué es la inyección SQL?

Escribimos una interfaz de inicio de sesión, configuramos la contraseña en fdsa y 1, el código es el siguiente

select * from tbl_user where username = 'fdsafds' and password = 'fdsa' or '1'='1'; 

Cuando entramos

用户名:fdsafds
密码:fdsa' or '1'='1
这样可以登录成功,为什么?

La declaración SQL anterior donde siempre se establece la condición, y se consultarán todos los datos en la tabla de la base de datos. El
fenómeno anterior se llama inyección SQL, es decir

    当用户提供的信息当中含有SQL语句的关键字,并且这些关键字参与了SQL语句的编译过程,导致原先的SQL语句原意被扭曲。
    根本原因:先拼接SQL语句,再进行编译,这是根本原因。

¿Cómo vemos la inyección SQL?

La inyección de SQL no es necesariamente un peligro, pero en la mayoría de los casos pondrá en peligro la seguridad del sistema Algunas funciones especiales en el sistema también pueden requerir la inyección de SQL.
Para admitir la inyección de SQL en este momento, debe utilizar la interfaz java.sql.Statement.

¿Cómo resolver la inyección de SQL o cómo prevenir la inyección de SQL?

java.sql.PreparedStatement se denomina un objeto de operación de base de datos precompilado, que puede evitar la inyección de SQL.
Principio:

对SQL语句框架进行预先编译,再接收用户提供的信息,即使提供的信息当中含有SQL语句的关键字,但是这些关键字并没有参与SQL语句的编译,
那么它也只是一个普通的字符串,SQL语句原意不会被扭曲,防止了SQL注入。

PreparedStatement es una subinterfaz de Statement

En la mayoría de los casos, sigue siendo necesario evitar la inyección de SQL, por lo que PreparedStatement se usa más.

La diferencia entre Statement y PreparedStatement

1.	Statement是先进行SQL语句拼接,再进行SQL语句的编译,存在SQL注入问题;
2.	PreparedStatement是预先编译SQL语句框架(带有占位符的SQL),然后再给占位符赋值,防止SQL注入;
3.	Statement编译一次,执行一次,编译一次,执行一次,PreparedStatement编译一次框架,执行N次,
4.	PreparedStatement效率较高。

Precompilación para procesamiento por lotes

Cuando necesitamos procesar cien o más datos, si usamos el método de procesamiento original:

for(int i=1;i<=100;i++){
    
    
            String sql="insert into dept(deptno,dname,loc) values("+i+",'dept_"+i+"','北京')";
            ps.executeUpdate(sql);
        }

Podemos ver los siguientes problemas:

  1. Problema al escribir el comando SQL:
    para garantizar que cada declaración SQL
    contenga datos diferentes, el método de empalme de cadenas "inserta en los valores del departamento (deptno, dname, loc) (" + i + ", 'dept _" + i + "', 'Beijing' ) ";

  2. Pérdida de tiempo: los objetos PreparedStatement solo pueden enviar un comando SQL a la vez.
    Para impulsar comandos de 100 sql, se requieren 100 viajes de ida y vuelta, lo que desperdicia mucho tiempo

Como podemos ver, el programa anterior es horrible para los programadores.
Para este tipo de problema de procesamiento por lotes, tomamos la forma de comandos SQL precompilados:

    "?"是占位符,一个问号代替一个值
    预编译SQL相当一个模具,在后续开发时,只需要将数据填充到占位符,就可以得到一个全新SQL
String sql ="insert into dept(deptno,dname,loc) values(?,?,?)";
    //注册Driver
  Class.forName("com.mysql.jdbc.Driver");
    //建立通道
   Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode", "root", "123");
    //【建立交通工具时,需要将预编译SQL命令注册到PreparedStatement】
    PreparedStatement ps =  con.prepareStatement(sql);

// Genere nuevos comandos SQL completando los datos en comandos SQL precompilados

 //4.向MySql服务器推送100条数据
        for(int i=1;i<=100;i++){
    
    
          
            ps.setInt(1, i); //inser into dept (deptno,dname,loc) values(1,?,?)
            ps.setString(2, "dept_"+i); //inser into dept (deptno,dname,loc) values(1,'dept_1',?)
            ps.setString(3, "北京");//inser into dept (deptno,dname,loc) values(1,'dept_1','北京')
            //在新的SQL语句生成之后,将SQL语句作为子弹添加到PS的弹夹
            ps.addBatch(); //[sql1,sql2,...]
        }

El método Statement.addBath () de Java agrega el comando SQL dado a la lista de comandos actual de este objeto Statement. Los comandos de esta lista se pueden ejecutar en lotes llamando al método executeBatch.
[Una vez] Envíe 100 sentencias sql al servidor mysql para su ejecución a través de ps

   ps.executeBatch(); // 推送100条SQL命令只需要往返一次

Entonces podemos cerrar los recursos que creamos antes.

Supongo que te gusta

Origin blog.csdn.net/qq_47917118/article/details/115269293
Recomendado
Clasificación