java 에서 Prepared Statement 과 Statement 상세 설명
8860 단어 자바PreparedStatementStatement
저 는 my sql 데이터 베 이 스 를 사용 합 니 다.admin 표를 예 로 들 면 다음 과 같 습 니 다.
맨 뒤에 구체 적 인 자바 코드 와 sql 코드 사례 가 있 습 니 다.




최종 실 행 된 sql 문 구 는 SELECT*FROM admin WHERE username='웨 이 샤 오 바 오'AND password='222\\'OR\'8\'=\'8'입 니 다.
위의 캡 처 를 통 해 알 수 있 듯 이 prepare Statement 대상 이 sql 주입 을 방지 하 는 방식 은 사용자 가 불법 으로 입력 한 작은 따옴표 를\\역 슬 래 쉬 로 전의 하여 sql 주입 을 방지 하 는 목적 을 달성 한 것 이다.
Statement 대상 은 그다지 호의 적 이지 않 습 니 다.사용자 가 불법 으로 입력 한 작은 따옴표 를\\역 슬 래 쉬 로 전의 하지 않 습 니 다!
Prepared Statement 은 sql 주입 을 효과적으로 방지 할 수 있 기 때문에 생산 환경 에 서 는 반드시 Prepared Statement 을 사용 해 야 하 며 Statement 을 사용 해 서 는 안 됩 니 다.
물론,당신 은 Prepared Statement 대상 이 sql 주입 을 어떻게 방지 하 는 지 자세히 연구 할 수 있 습 니 다.저 는 최종 적 으로 실 행 된 sql 문 구 를 인쇄 했 습 니 다.인쇄 된 sql 문 구 를 보면 알 수 있 습 니 다.원래 my sql 데이터베이스 생산 업 체 였 습 니 다.Prepared Statement 인터페이스의 실현 류 에서 setString(int parameterIndex,String x)함수 에서 처 리 했 습 니 다.작은 따옴표 로 의 미 를 바 꾸 었 습 니 다.(사용자 가 입력 한 문자열 에 작은 따옴표 가 있 으 면 my sql 데이터베이스 생산 업 체 의 setString()이 함수 가 작은 따옴표 로 의 미 를 바 꿉 니 다)
여러분 이 관심 이 있 으 면 인터넷 에 가서 my sql 데이터베이스 드라이버 의 소스 코드 를 다운로드 하고 my sql 데이터베이스 생산 업 체 의 드라이버 소스 코드 를 보 세 요.소스 코드 에서 setString(int parameterIndex,String x)함 수 를 찾 아 이 함수 에 어떻게 쓰 여 있 는 지 보 세 요.저 는 my sql 데이터베이스 생산 업 체 의 드라이버 소스 코드 를 다운로드 하지 않 았 습 니 다.mysql 데이터베이스 드라이버 jar 패 키 지 를 압축 해제 하고 Prepared Statement.class 파일 을 찾 았 습 니 다.컴 파일 도 구 를 이용 하여 컴 파일 을 역 컴 파일 했 습 니 다.다음 과 같 습 니 다.









이제 Prepared Statement 이 sql 주입 을 어떻게 방지 하 는 지 아 시 겠 죠?
222'OR'8'='8 과 같은 sql 주입 은 부 드 러 운 편 입 니 다.더 나 쁜 사용자 들 이 입력 한 불법 값 은 delete from table Name 이나 truncate table Name 입 니 다.이것 은 매우 위험 하고 drop table Name 입 니 다.일부 데이터 베 이 스 는 당신 을 성공 시 키 지 못 하지만,많은 데이터 베 이 스 를 사용 하면 이 문 구 를 실행 할 수 있 기 때문에 생산 환경 에 서 는 반드시 Prepared Statement 을 사용 해 야 하 며,Statement 을 사용 해 서 는 안 된다.
다음은 몇 가지 예 를 들 어 캡 처 를 보 겠 습 니 다.

최종 인쇄 SELECT*from admin 사용자 이름='웨 샤 오 바 오'and password='\';DROP TABLE tableName;#'

최종 인쇄 SELECT*from admin 사용자 이름='웨 샤 오 바 오'and password='\';delete from tableName;#'

최종 인쇄 SELECT*from admin 사용자 이름='웨 샤 오 바 오'and password='\';truncate table tableName;#'

다음은 자바 코드 와 sql 문 구 를 참고 하 시기 바 랍 니 다.주로 Prepared Statement 대상 을 테스트 하기 위해 서 입 니 다.그래서 자바 코드 는 대충 썼 습 니 다.아 쉬 운 대로 보 세 요!
package com.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/*
* PreparedStatement sql , , mysql ,
* PreparedStatement setString(int parameterIndex, String x)
* , ( , mysql setString()
* , )
*/
public class TestConnMySql2 {
public static void main(String[] args) {
String connStr = "jdbc:mysql://localhost:3306/girls";
// String sql = "select * from admin";
String sql = "SELECT * FROM admin WHERE username = ? AND password = ?";
try {
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(connStr, "root", "root");
System.out.println(" =" + connection);
//Statement sql
// Statement stmt = connection.createStatement();
//PreparedStatement sql , PreparedStatement, Statement
PreparedStatement prepareStatement = connection.prepareStatement(sql);
prepareStatement.setString(1, " ");
//
// prepareStatement.setString(2, "222");
// sql ( )
prepareStatement.setString(2, "222' OR '8'='8");
/*
* sql , ,
* delete from tableName truncate table tableName ,
* drop table tableName; ,
* , PreparedStatement, Statement
*/
// sql ( ) mysql # ( mysql , )
// prepareStatement.setString(2, "'; DROP TABLE tableName;#");
// sql ( )
// prepareStatement.setString(2, "'; delete from tableName;#");
// sql ( )
// prepareStatement.setString(2, "'; truncate table tableName;#");
ResultSet rs = prepareStatement.executeQuery();
System.out.println("sql=" + prepareStatement.toString());
int col = rs.getMetaData().getColumnCount();
System.out.println("============================");
while (rs.next()) {
for (int i = 1; i <= col; i++) {
System.out.print(rs.getString(i) + "\t");
if ((i == 2) && (rs.getString(i).length() < 8)) {
System.out.print("\t");
}
}
System.out.println("");
}
System.out.println("============================");
rs.close();
prepareStatement.close();
connection.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
}
#
SELECT * FROM admin WHERE username = ' ' AND `password` = '222';
#
SELECT * FROM admin WHERE username = ' ' AND PASSWORD = '222';
#sql ( ) Statement , sql ( )
SELECT * FROM admin WHERE username = ' ' AND PASSWORD = '222' OR '8'='8'
#sql ( ) PreparedStatement , sql
SELECT * FROM admin WHERE username = ' ' AND PASSWORD = '222\' OR \'8\'=\'8'
#sql ( ) Statement , sql (DROP )
SELECT * FROM admin WHERE username = ' ' AND PASSWORD = ''; DROP TABLE tableName;#'
#sql ( ) PreparedStatement , sql
SELECT * FROM admin WHERE username = ' ' AND PASSWORD = '\'; DROP TABLE tableName;#'
#sql ( ) Statement , sql (TRUNCATE )
SELECT * FROM admin WHERE username = ' ' AND PASSWORD = ''; TRUNCATE TABLE tableName;#'
#sql ( ) PreparedStatement , sql
SELECT * FROM admin WHERE username = ' ' AND PASSWORD = '\'; truncate table tableName;#'
#sql ( ) Statement , sql (DELETE )
SELECT * FROM admin WHERE username = ' ' AND PASSWORD = ''; DELETE FROM tableName;#'
#sql ( ) PreparedStatement , sql
SELECT * FROM admin WHERE username = ' ' AND PASSWORD = '\'; delete from tableName;#'
# PreparedStatement, Statement
/*
mysql 3 ,
*/
#
-- ( :-- , , )
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.