programing

JDBC 준비 상태에 매개 변수 전달

bestprogram 2023. 10. 19. 22:40

JDBC 준비 상태에 매개 변수 전달

저는 제 프로그램을 위한 검증 수업을 하려고 합니다.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. 이렇게 하면 문의 형식이 올바르게 지정되고 SQL 주입을 방지할 수 있습니다.

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

사용법에 대한 좋은 튜토리얼이 있습니다.PreparedStatement자바 자습서에서 s를 올바르게 표시됩니다.

준비된 문을 사용하는 경우 다음과 같이 사용해야 합니다.

"SELECT * from employee WHERE userID = ?"

그러면 다음을 사용합니다.

statement.setString(1, userID);

?쿼리에서 사용자 ID가 전달된 사용자 ID로 대체됩니다.setString방법.

여기에서 Prepared Statement를 사용하는 방법을 살펴보십시오.

쿼리에 문제가 있습니다.

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

문장 준비를 사용하고 있습니다.따라서 다음을 사용하여 파라미터를 설정해야 합니다.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);

SQL 주입 공격을 방지하는 이와 같은 작업을 수행합니다.

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

'?'를 사용하여 PreparedStatements를 사용하여 문자열에서 사용자 지정 매개 변수를 설정할 수 있습니다.

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

사용자에게 직접 패스하는 경우쿼리 중인 ID는 SQL INJUCTION Attack의 공격을 받을 수 있습니다.

언급URL : https://stackoverflow.com/questions/12745186/passing-parameters-to-a-jdbc-preparedstatement