推奨事項 (無料): 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;
#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 通常のログイン
正しいユーザー名とパスワードを入力すると、「ログイン成功」というプロンプトが表示されます
1.4 ログイン失敗
ユーザー名またはパスワードを間違って入力すると、「ユーザー名またはパスワードが間違っています。もう一度入力してください。」というプロンプトが表示されます
1.5 SQL インジェクションのシミュレーション
連結された文字列には、定数条件である or '1'='1' が含まれているため、以前のユーザーとパスワードが存在しない場合は、すべてのレコードが削除されるため、「ログイン成功」というプロンプトが表示されます。
1.6 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 ユーザー名とパスワードが間違っています
ユーザー名またはパスワードが間違って入力されると、「ユーザー名またはパスワードが間違っています。再入力してください。」というプロンプトが表示されます。
2.4 SQL インジェクションのシミュレート
#先ほどの状況に合わせて SQL インジェクションを記述すると、テスト後は SQL インジェクションが発生しなくなります。2.5 SQL 構文エラーのシミュレーション前処理クラスを使用した後、一重引用符または二重引用符で囲まれた内容を入力すると SQL が機能しません構文エラーが再び表示されます
#3. 概要
Statement と PreparedStatement の主な違いは次のとおりです:
Statement は、静的 SQL ステートメントを実行するために使用されます。実行中、準備された SQL ステートメントを指定する必要があります。
以上がSQL インジェクションとその修正方法について学ぶの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。