Maison  >  Article  >  base de données  >  Dépannage des problèmes d'injection SQL

Dépannage des problèmes d'injection SQL

coldplay.xixi
coldplay.xixiavant
2021-01-12 09:22:531734parcourir

<img src="https://img.php.cn/upload/article/000/000/052/5ffcf9b492b47340.jpg" alt="Dépannage des problèmes d'injection SQL" >

推荐(免费):<a href="https://www.php.cn/sql/" target="_blank">SQL教程</a>

SQLQu'est-ce que l'injection ?

Regardez la définition de l'Encyclopédie Baidu :
Dépannage des problèmes dinjection SQL
Ah, c'est un paragraphe tellement long que je ne veux pas le lire. Utilisons un exemple pour expliquer quoi SQL注入. est :

Créez une nouvelle base de données, créez un tableau et ajoutez deux lignes de données :

use db1;create table user(
	id int primary key auto_increment,
	username varchar(32),
	password varchar(32));insert into user values(null,'zhangsan','123');insert into user values(null,'lisi','234');

Le tableau est comme indiqué ci-dessous :
Dépannage des problèmes dinjection SQL
Ensuite, écrivez-le en utilisant avec désinvolture JDBC Opération de connexion :

package com.wzq.jdbc;import com.wzq.util.JDBCUtils;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Scanner;/*
 *   需求:
 *       1、通过键盘录入用户名和密码
 *       2、判断用户是否登陆成功
 * */public class JDBCDemo05 {

    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = cin.nextLine();
        System.out.println("请输入密码:");
        String password = cin.nextLine();

        boolean res = new JDBCDemo05().login(username, password);
        if (res) System.out.println("登陆成功!");
        else System.out.println("登陆失败!");

    }

    public boolean login(String username, String password) {
        if (username == null || password == null) {
            return false;
        }
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try {
            //1、获取数据库连接
            conn = JDBCUtils.getConnection();   //JDBCUtils工具类
            //2、定义sql
            String sql = "select * from user where username = '" + username + "' and password = '" + password + "'";
            //3、获取执行sql的对象
            stmt = conn.createStatement();
            //4、执行sql
            rs = stmt.executeQuery(sql);
            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, stmt, conn);
        }
        return false;
    }}

Testez-le :
Dépannage des problèmes dinjection SQL
Vous pouvez voir qu'il n'y a aucun problème avec l'inspection ordinaire. Utilisez maintenant SQL注入 :

Entrez le nom du compte avec désinvolture, Saisie du mot de passe :

a' or 'a'='a
Dépannage des problèmes dinjection SQL J'ai été surpris de constater que la connexion a réussi. Sortez
et jetez un œil : sql

select * from user where username = 'askjdhjksahd' and password = 'a' or 'a' = 'a'
Vous pouvez voir les conditions après

Quel que soit le résultat qui est vrai, le tableau entier sera affiché : where
Dépannage des problèmes dinjection SQL Donc. , en résumé Comme mentionné ci-dessus : lors de l'épissage de
, certains mots-clés spéciaux de sql sont impliqués dans l'épissage des chaînes, ce qui entraînera des problèmes de sécurité. C'est pourquoi la connexion ci-dessus réussit. sql


Alors comment résoudre ce problème ?

Réponse : Utilisez l'objet

au lieu de l'objet PreparedStatement. L'objet Statement

est une sous-classe de l'objet PreparedStatement. Il est précompilé Statement, il s'exécutera donc plus rapidement que sql. Statemnet

utilise PerpaerdStatement comme espace réservé, et utilise ? pour attribuer une valeur à setXxx(索引,值) ?

Remplaçons donc

et écrivons le code : Statement

    public boolean login(String username, String password) {        if (username == null || password == null) {            return false;
        }
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        try {            //1、获取数据库连接
            conn = JDBCUtils.getConnection();   //JDBCUtils类
            //2、定义sql
            String sql = "select * from user where username = ? and password = ?";
            //3、获取执行sql的对象
            pstmt = conn.prepareStatement(sql);
            pstmt.setString(1,username);
            pstmt.setString(2,password);
            //4、执行sql
            rs = pstmt.executeQuery();
            return rs.next();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.close(rs, pstmt, conn);
        }        return false;
    }
Testez-le :


Dépannage des problèmes dinjection SQL Résolu avec succès !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer