プログラムの検証クラスを作成しようとしています。すでにMySQLデータベースへの接続を確立し、テーブルに行を挿入しました。テーブルは、firstName
、lastName
、およびuserID
フィールドで構成されます。ここで、コンストラクターのパラメーターを使用して、データベースの特定の行を選択します。
import Java.sql.*;
import Java.sql.PreparedStatement;
import Java.sql.Connection;
public class Validation {
private PreparedStatement statement;
private Connection con;
private String x, y;
public Validation(String userID) {
try {
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test", "root", "");
statement = con.prepareStatement(
"SELECT * from employee WHERE userID = " + "''" + userID);
ResultSet rs = statement.executeQuery();
while (rs.next()) {
x = rs.getString(1);
System.out.print(x);
System.out.print(" ");
y = rs.getString(2);
System.out.println(y);
}
} catch (Exception ex) {
System.out.println(ex);
}
}
}
しかし、それは機能していないようです。
userID
を設定するには、 setString()
メソッドを使用する必要があります。これにより、ステートメントが適切にフォーマットされ、_SQL injection
:
statement =con.prepareStatement("SELECT * from employee WHERE userID = ?");
statement.setString(1, userID);
the Java Tutorials でPreparedStatement
sを適切に使用する方法に関する素晴らしいチュートリアルがあります。
クエリに問題があります。
_ statement =con.prepareStatement("SELECT * from employee WHERE userID = "+"''"+userID);
ResultSet rs = statement.executeQuery();
_
Prepare Statementを使用しています。したがって、userId
のタイプに応じて、statement.setInt()
またはstatement.setString()
を使用してパラメーターを設定する必要があります。
次のように置き換えます:-
_ statement =con.prepareStatement("SELECT * from employee WHERE userID = :userId");
statement.setString(userId, userID);
ResultSet rs = statement.executeQuery();
_
または、名前付き値の代わりに_?
_を使用できます-_:userId
_ ..
_ statement =con.prepareStatement("SELECT * from employee WHERE userID = ?");
statement.setString(1, userID);
_
準備済みステートメントを使用している場合、次のように使用する必要があります。
"SELECT * from employee WHERE userID = ?"
次に使用します:
statement.setString(1, userID);
?
は、クエリ内でsetString
メソッドに渡されるユーザーIDに置き換えられます。
ご覧ください here 使用方法 PreparedStatement 。
SQLインジェクション攻撃 も防ぐこのようなことをしてください
statement = con.prepareStatement("SELECT * from employee WHERE userID = ?");
statement.setString(1, userID);
ResultSet rs = statement.executeQuery();
「?」を使用できますPreparedStatmentsを使用して文字列にカスタムパラメータを設定します。
statement =con.prepareStatement("SELECT * from employee WHERE userID = ?");
statement.setString(1, userID);
ResultSet rs = statement.executeQuery();
実行中にクエリでuserIDを直接渡すと、SQL INJECTION Attack。によって攻撃される可能性があります