Maison  >  Article  >  base de données  >  Quelle est l’erreur d’injection de l’instruction MySQL ?

Quelle est l’erreur d’injection de l’instruction MySQL ?

青灯夜游
青灯夜游original
2020-10-20 14:18:572342parcourir

L'erreur d'injection de l'instruction mysql est d'utiliser l'interface externe de certaines bases de données pour insérer les données utilisateur dans le langage SQL réel, atteignant ainsi l'objectif d'envahir la base de données et même le système d'exploitation. Les attaquants l'utilisent pour lire, modifier ou supprimer des données dans la base de données, obtenir des informations sur les utilisateurs, des mots de passe et d'autres informations dans la base de données, ou plus sérieusement, obtenir des privilèges d'administrateur.

Quelle est l’erreur d’injection de l’instruction MySQL ?

(Tutoriel recommandé : Tutoriel vidéo MySQL)

Erreur d'injection SQL (injection SQL)

L'injection SQL consiste à utiliser l'interface externe de certaines bases de données pour insérer les données utilisateur dans le langage d'exploitation de la base de données (SQL), atteignant ainsi l'objectif d'envahir la base de données et même le système d'exploitation. Cela se produit principalement parce que le programme ne filtre pas strictement les données saisies par l'utilisateur, ce qui entraîne l'exécution d'instructions de requête de base de données illégales.
"Introduction approfondie à MySQL"

Dangers
Les attaquants l'utilisent pour lire, modifier ou supprimer des données dans la base de données et obtenir des informations sur les utilisateurs et des mots de passe dans la base de données, etc. des informations, et plus sérieusement, l'obtention des privilèges d'administrateur.

Exemple

 //注入式错误
    public static void test3(String name,String passward){
        Connection connection = null;
        Statement st = null;
        ResultSet rs = null;
        try {
            // 加载JDBC 驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 获得JDBC 连接
            String url = "jdbc:mysql://localhost:3306/tulun";
            connection = DriverManager.getConnection(url,"root","123456");
            //创建一个查询语句
            st = connection.createStatement();
            //sql语句
            String sql = "select * from student where name = '"+ name+"' and passward = '"+passward+"'";
            rs = st.executeQuery(sql);

            if(rs.next()){
                System.out.println("登录成功。");
            }else{
                System.out.println("登录失败。");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
       
        test3("wjm3' or '1 = 1","151515");

    }

Informations sur la base de données
Quelle est l’erreur d’injection de l’instruction MySQL ?
Comme indiqué dans le code ci-dessus, le nom d'utilisateur est wjm3' ou '1 = 1, le mot de passe est 151515. La base de données montre que nous n'avons pas un tel utilisateur. Elle aurait dû afficher un échec de connexion, mais le résultat a été une connexion réussie, car ou '1 = 1 est non. Plus le contenu du nom d'utilisateur. Il s'agit désormais du contenu de l'instruction SQL. Quoi qu'il en soit, le résultat est vrai, ce qui signifie que vous pouvez vous connecter sans saisir de mot de passe. Un problème de sécurité se pose ici.

Solution

1. PrepareStatement

 //注入式错误
    public static void test3(String name,String passward){
        Connection connection = null;
        PreparedStatement st = null;
        ResultSet rs = null;
        try {
            // 加载JDBC 驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 获得JDBC 连接
            String url = "jdbc:mysql://localhost:3306/tulun";
            connection = DriverManager.getConnection(url,"root","123456");
            //创建一个查询语句
            String sql1 =  "select * from student where name = ? and passward = ?";
            st = connection.prepareStatement(sql1);
           st.setString(1,name);
           st.setString(2,passward);
            //sql语句
            //String sql = "select * from student where name = '"+ name+"' and passward = '"+passward+"'";
            rs = st.executeQuery();

            if(rs.next()){
                System.out.println("登录成功。");
            }else{
                System.out.println("登录失败。");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            try {
                connection.close();
                st.close();
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
     public static void main(String[] args) {
        test3("wjm3' or '1 = 1","151515");
    }

Peu importe le paramètre name dans le code ci-dessus, il s'agit uniquement du paramètre name et ce ne sera pas le cas. être utilisé comme instruction SQL. Cette méthode est généralement recommandée car elle est plus sûre.
2. Définissez vos propres fonctions de vérification

  • Organisez les données pour les rendre valides
  • Rejetez les entrées illégales connues
  • Uniquement accepter les entrées juridiques connues

Donc, si vous souhaitez obtenir la meilleure posture de sécurité, la meilleure solution actuellement est de simplement classer les données soumises par l'utilisateur ou qui peuvent changer, les expressions régulières sont appliqués respectivement pour détecter et valider strictement les données d’entrée fournies par l’utilisateur.
En fait, il vous suffit de filtrer les combinaisons de symboles illégales pour empêcher les formes d'attaques connues, et si de nouvelles combinaisons de symboles d'attaque sont découvertes, ces combinaisons de symboles peuvent également être ajoutées pour continuer à empêcher de nouvelles attaques. En particulier, le symbole espace et le symbole qui sépare les mots-clés ont le même effet, comme "/**/". Si ce symbole peut être filtré avec succès, de nombreuses attaques par injection ne pourront pas se produire, et elles doivent également être filtrées. en même temps, la représentation hexadécimale est "%XX".

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn