私はJava + mysqlで作業しています。次のコードがあります。
String sql = "INSERT INTO tableA (id, age) VALUES (1, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
stmt.setString(age);
stmt.execute();
String age :-( がユーザーからの入力であると仮定すると、上記のコードが SQL インジェクションを防ぐことを願っています。mysql ドライバーは 1 つのステートメントで複数のクエリを許可しないことがわかったので、次のような入力
76); Drop table tableB; -- )
準備済みステートメントを使用していなくても、mysql によって拒否されます。ただし、後者の場合、次のような入力
(select id from tableB where age = 10) // lets assume this returns 20
データベースに (1, 20) を挿入しても受け入れられます。上記のように PreparedStatement を使用することで、この種の入力が拒否され、SQL インジェクション攻撃を防ぐことが期待できます。しかし、私が見るものは非常に奇妙です。このサブクエリが実行されるかどうかはわかりませんが、データベースにレコード (1, 0) が挿入されていることがわかります。ここでは、mysql から例外を取得する必要があると予想しています。
この時点で、私は完全に混乱しています。何かご意見は?私の仮定は正しいですか?ご協力いただきありがとうございます。