Maison  >  Article  >  base de données  >  En savoir plus sur l'injection SQL et comment y remédier

En savoir plus sur l'injection SQL et comment y remédier

coldplay.xixi
coldplay.xixiavant
2021-01-28 18:17:453307parcourir

En savoir plus sur l'injection SQL et comment y remédier

Recommandé (gratuit) : Tutoriel SQL

L'injection SQL fait référence à l'intrusion de données saisies par l'utilisateur par le Web applications Il n'y a aucun jugement sur la légalité ou le filtrage laxiste. Les attaquants peuvent ajouter des instructions SQL supplémentaires à la fin des instructions de requête prédéfinies dans l'application Web pour réaliser des opérations illégales à l'insu de l'administrateur, trompant ainsi la base de données. Le serveur effectue des requêtes arbitraires non autorisées. obtenir en outre des informations de données correspondantes.

1. Cas d'injection SQL

Simulez un cas d'injection SQL de connexion utilisateur L'utilisateur saisit le nom d'utilisateur et le mot de passe sur la console, puis utilise la concaténation de chaînes de déclaration. Implémentez la connexion utilisateur.

1.1 Créez d'abord la table utilisateur et les données dans la base de données

-- 创建一张用户表
CREATE TABLE `users` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(20),
  `password` VARCHAR(50),
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;


-- 插入数据
INSERT INTO  users(username,`password`) VALUES('张飞','123321'),('赵云','qazxsw'),('诸葛亮','123Qwe');
INSERT INTO  users(username,`password`) VALUES('曹操','741258'),('刘备','plmokn'),('孙权','!@#$%^');


-- 查看数据
SELECT  * FROM users;

En savoir plus sur l'injection SQL et comment y remédier

1.2 Écrire un programme de connexion

import java.sql.*;
import java.util.Scanner;


public class TestSQLIn {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=UTF-8";
        Connection conn = DriverManager.getConnection(url,"root","123456");
        //System.out.println(conn);
        // 获取语句执行平台对象 Statement
        Statement smt = conn.createStatement();


        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String userName = sc.nextLine();
        System.out.println("请输入密码:");
        String password = sc.nextLine();


        String sql = "select  * from users where username = '" + userName + "'  and  password = '" + password +"'";
        //打印出SQL
        System.out.println(sql);
        ResultSet resultSet = smt.executeQuery(sql);
        if(resultSet.next()){
            System.out.println("登录成功!!!");
        }else{
            System.out.println("用户名或密码错误,请重新输入!!!");
        }


        resultSet.close();
        smt.close();
        conn.close();


    }


}

1.3 Connexion normale

Après avoir entré le nom d'utilisateur et le mot de passe corrects, il affiche "Connexion réussie"

En savoir plus sur l'injection SQL et comment y remédier

1.4 Échec de connexion

Lors de la saisie d'un nom d'utilisateur ou d'un mot de passe incorrect, le message "Le nom d'utilisateur ou le mot de passe est incorrect, veuillez le ressaisir"

En savoir plus sur l'injection SQL et comment y remédier

1.5 Simulation d'injection SQL

La chaîne concaténée contient ou '1'='1', qui est une condition constante, donc même si le l'utilisateur et le mot de passe précédents n'existent pas, tous les enregistrements seront également supprimés, donc "Connexion réussie" s'affiche

En savoir plus sur l'injection SQL et comment y remédier

Erreur de syntaxe SQL 1.6

En utilisant l'épissage, SQL apparaîtra également des erreurs de syntaxe et d'autres erreurs, telles que

En savoir plus sur l'injection SQL et comment y remédier

2. À l'aide de la méthode Statement, les utilisateurs peuvent modifier le texte original via l'épissage de chaînes. La véritable signification de SQL entraîne un risque d'injection SQL. Pour résoudre l'injection SQL, vous pouvez utiliser l'objet de prétraitement PreparedStatement au lieu de Statement pour le traitement.

1.1 Écrire un nouveau programme

import java.sql.*;
import java.util.Scanner;


public class TestSQLIn {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        String url = "jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=UTF-8";
        Connection conn = DriverManager.getConnection(url,"root","123456");
        //System.out.println(conn);
        // 获取语句执行平台对象 Statement
        // Statement smt = conn.createStatement();


        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String userName = sc.nextLine();
        System.out.println("请输入密码:");
        String password = sc.nextLine();


        String sql = "select  * from users where username = ? and  password = ? ";
        // System.out.println(sql);
        // ResultSet resultSet = smt.executeQuery(sql);
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        preparedStatement.setString(1,userName);
        preparedStatement.setString(2,password);


        ResultSet  resultSet = preparedStatement.executeQuery();
        if(resultSet.next()){
            System.out.println("登录成功!!!");
        }else{
            System.out.println("用户名或密码错误,请重新输入!!!");
        }




        preparedStatement.close();
        resultSet.close();
        // smt.close();
        conn.close();


    }


}
2.2 Connectez-vous normalement

En savoir plus sur l'injection SQL et comment y remédier2.3 Nom d'utilisateur et mot de passe incorrects

Lorsque le nom d'utilisateur ou le mot de passe est mal saisi, le message "Le nom d'utilisateur ou le mot de passe est incorrect, veuillez le ressaisir"

En savoir plus sur l'injection SQL et comment y remédier2.4 Simuler l'injection SQL

Selon la situation précédente, écrivez l'injection SQL Après le test, l'injection SQL ne se produira plus.

En savoir plus sur l'injection SQL et comment y remédier2.5 Simulation des erreurs de syntaxe SQL

Après avoir utilisé la classe de prétraitement, la saisie de contenu avec des guillemets simples ou doubles ne fonctionnera pas SQL des erreurs de syntaxe réapparaîtront

En savoir plus sur l'injection SQL et comment y remédier3.Résumé

Les principales différences entre Statement et PreparedStatement sont les suivantes :

L'instruction est utilisée pour exécuter des instructions SQL statiques. Lors de l'exécution, une instruction SQL préparée doit être spécifiée
  • PrepareStatement est un objet d'instruction SQL précompilé. peut contenir des paramètres dynamiques "?", et la valeur du paramètre peut être définie dynamiquement pour "?" pendant l'exécution
  • PrepareStatement peut réduire le nombre de compilations et améliorer les performances de la base de données

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