web-dev-qa-db-ja.com

JDBC PreparedStatementにパラメーターを渡す

プログラムの検証クラスを作成しようとしています。すでに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);
        }
    }
}

しかし、それは機能していないようです。

15
user1708134

userIDを設定するには、 setString() メソッドを使用する必要があります。これにより、ステートメントが適切にフォーマットされ、_SQL injection

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

the Java TutorialsPreparedStatementsを適切に使用する方法に関する素晴らしいチュートリアルがあります。

37
Keppil

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

_   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);
_
4
Rohit Jain

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

"SELECT * from employee WHERE userID = ?"

次に使用します:

statement.setString(1, userID);

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

ご覧ください here 使用方法 PreparedStatement

4

SQLインジェクション攻撃 も防ぐこのようなことをしてください

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

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

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

実行中にクエリでuserIDを直接渡すと、SQL INJECTION Attack。によって攻撃される可能性があります

1