java 에서 Prepared Statement 과 Statement 상세 설명

모두 가 알다 시 피 Prepared Statement 대상 은 sql 주입 을 방지 할 수 있 고 Statement 은 sql 주입 을 방지 할 수 없다.그러면 여러분 은 왜 Prepared Statement 대상 이 sql 주입 을 방지 할 수 있 는 지 알 고 있 습 니 다.다음은 제 사례 를 보면 알 수 있 을 것 입 니 다!
저 는 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   ,      
*/
 
#      
 
--        (  :--     ,          ,      )
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기