ホームページ  >  記事  >  データベース  >  SQL インジェクションとその修正方法について学ぶ

SQL インジェクションとその修正方法について学ぶ

coldplay.xixi
coldplay.xixi転載
2021-01-28 18:17:453306ブラウズ

SQL インジェクションとその修正方法について学ぶ

推奨事項 (無料): sql チュートリアル

##SQL インジェクションとは、Web アプリケーションによるユーザー入力データの侵入を指します。合法性やフィルタリングの甘さについての判断はありません。攻撃者は、Web アプリケーション内の事前定義されたクエリ ステートメントの末尾に追加の SQL ステートメントを追加して、管理者の知らないうちに不正な操作を実行し、データベースを欺くことができます。サーバーは、許可されていない任意のクエリを実行して、さらに対応するデータ情報を取得します。

1. SQL インジェクションのケース

ユーザー ログインの SQL インジェクションのケースをシミュレートします。ユーザーはコンソールでユーザー名とパスワードを入力し、ステートメント文字列の連結を使用します。 . ユーザーログインを実装します。

#1.1 まずデータベースにユーザー テーブルとデータを作成します

-- 创建一张用户表
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;

SQL インジェクションとその修正方法について学ぶ#1.2ログインプログラム

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 通常のログイン

正しいユーザー名とパスワードを入力すると、「ログイン成功」というプロンプトが表示されます

SQL インジェクションとその修正方法について学ぶ1.4 ログイン失敗

ユーザー名またはパスワードを間違って入力すると、「ユーザー名またはパスワードが間違っています。もう一度入力してください。」というプロンプトが表示されます

SQL インジェクションとその修正方法について学ぶ1.5 SQL インジェクションのシミュレーション

連結された文字列には、定数条件である or '1'='1' が含まれているため、以前のユーザーとパスワードが存在しない場合は、すべてのレコードが削除されるため、「ログイン成功」というプロンプトが表示されます。

SQL インジェクションとその修正方法について学ぶ1.6 SQL 構文エラー

スプライシング方法を使用すると、SQL では、

SQL インジェクションとその修正方法について学ぶ

2 などの構文エラーやその他のエラーも表示されます。

Statement メソッドを使用すると、文字列の結合によって元のテキストを変更できますが、SQL の本当の意味では SQL インジェクションのリスクが伴います。 SQL インジェクションを解決するには、Statement の代わりに前処理オブジェクト PreparedStatement を使用して処理します。

1.1 新しいプログラムを作成します

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 通常のログイン

2.3 ユーザー名とパスワードが間違っていますSQL インジェクションとその修正方法について学ぶ

ユーザー名またはパスワードが間違って入力されると、「ユーザー名またはパスワードが間違っています。再入力してください。」というプロンプトが表示されます。

2.4 SQL インジェクションのシミュレートSQL インジェクションとその修正方法について学ぶ

#先ほどの状況に合わせて SQL インジェクションを記述すると、テスト後は SQL インジェクションが発生しなくなります。

2.5 SQL 構文エラーのシミュレーション

SQL インジェクションとその修正方法について学ぶ

前処理クラスを使用した後、一重引用符または二重引用符で囲まれた内容を入力すると SQL が機能しません構文エラーが再び表示されます

#3. 概要

SQL インジェクションとその修正方法について学ぶStatement と PreparedStatement の主な違いは次のとおりです:

Statement は、静的 SQL ステートメントを実行するために使用されます。実行中、準備された SQL ステートメントを指定する必要があります。

    PrepareStatement は、プリコンパイルされた SQL ステートメント オブジェクトです。ステートメント動的パラメータ「?」を含めることができ、実行中にパラメータ値を動的に「?」に設定できます
  • PrepareStatement によりコンパイルの数が減り、データベースのパフォーマンスが向上します

以上がSQL インジェクションとその修正方法について学ぶの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。