27

プログラムの検証クラスを作成しようとしています。すでに MySQL データベースへの接続を確立しており、行をテーブルに挿入しています。テーブルはfirstNamelastNameおよび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);
        }
    }
}
    

しかし、うまくいかないようです。

4

6 に答える 6

55

setString()メソッドを使用してを設定する必要がありますuserID。これにより、ステートメントが適切にフォーマットされていることが保証され、次のことが防止されますSQL injection

statement =con.prepareStatement("SELECT * from employee WHERE  userID = ?");
statement.setString(1, userID);

Java チュートリアルPreparedStatementには、s の適切な使用方法に関する優れたチュートリアルがあります。

于 2012-10-05T11:24:22.233 に答える
6

クエリに問題があります..

   statement =con.prepareStatement("SELECT * from employee WHERE  userID = "+"''"+userID);
   ResultSet rs = statement.executeQuery();

Prepare Statement を使用しています。そのため、パラメータのタイプを使用してstatement.setInt()、またはそれstatement.setString()に応じてパラメータを設定する必要があります。userId

それを次のように置き換えます: -

   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);
于 2012-10-05T11:25:22.397 に答える
5

準備済みステートメントを使用している場合は、次のように使用する必要があります。

"SELECT * from employee WHERE userID = ?"

次に使用します。

statement.setString(1, userID);

?クエリでは、メソッドに渡されたユーザー ID に置き換えられますsetString

こちらをご覧くださいPreparedStatement の使用方法。

于 2012-10-05T11:27:17.697 に答える
2

このようなことを行うと、 SQL インジェクション攻撃も防止されます

statement = con.prepareStatement("SELECT * from employee WHERE  userID = ?");
statement.setString(1, userID);
ResultSet rs = statement.executeQuery();
于 2012-10-05T11:25:08.913 に答える
1

「?」を使用できます。PreparedStatments を使用して文字列でカスタム パラメータを設定します。

statement =con.prepareStatement("SELECT * from employee WHERE  userID = ?");
statement.setString(1, userID);
ResultSet rs = statement.executeQuery();

クエリで直接 userID を渡すと、SQL インジェクション攻撃を受ける可能性があります。

于 2012-10-05T11:26:42.070 に答える