면접 관련: my batis 는 SQL 주입 을 어떻게 방지 합 니까?

2836 단어 면접 관련Mybatis
SQL 주입
데이터 구동 을 공격 하 는 데 사용 되 는 응용 프로그램 입 니 다. 악의 적 인 SQL 문 구 는 실 행 된 실체 필드 에 삽입 되 었 습 니 다 (예 를 들 어 데이터베이스 내용 을 공격 자 에 게 저장 하기 위해). 모두 가 낯 설 지 않 고 흔히 볼 수 있 는 공격 방식 입 니 다.공격 자 는 인터페이스의 폼 정보 나 URL 에 이상 한 SQL 세 션 (예 를 들 어 'or' 1 '=' 1 '과 같은 문 구 를 입력 하면 매개 변수 검사 가 부족 한 프로그램 에 침입 할 수 있 습 니 다.그래서 우리 의 응용 에서 이런 공격 방식 에 대비 하기 위해 일 을 해 야 한다.일부 안전성 에 대한 요구 가 높 은 응용 프로그램 (예 를 들 어 은행 소프트웨어) 에서 SQL 문 구 를 모두 저장 과정 으로 바 꾸 는 방식 을 자주 사용 하여 SQL 주입 을 방지한다.이것 은 당연히 매우 안전 한 방식 이지 만, 우 리 는 평소에 개발 할 때 이런 딱딱 한 방식 이 필요 하지 않 을 것 이다.
 
Mybatis
Mybatis 프레임 워 크 는 반자동 화 된 지구 층 프레임 워 크 로 서 SQL 문 구 는 우리 가 직접 작성 해 야 합 니 다. 이 럴 때 SQL 주입 을 방지 해 야 합 니 다.사실 MyBatis 의 SQL 은 '입력 + 출력' 기능 을 가지 고 함수 와 유사 한 구조 로 위의 두 가지 예 를 참고 합 니 다.그 중에서 parameterType 은 입력 한 매개 변수 유형 을 표시 하고 resultType 은 출력 한 매개 변수 유형 을 표시 합 니 다.위의 글 에 응답 합 니 다. SQL 주입 을 막 으 려 면 당연히 입력 매개 변수 에 공 을 들 여야 합 니 다.위 코드 에 서 는 \ # 의 입력 매개 변수 가 SQL 에 연 결 된 부분 을 사용 합 니 다. 매개 변 수 를 입력 한 후 실 행 된 SQL 문 구 를 출력 하면 SQL 이 이 렇 습 니 다.
select id, username, password, role from user where username=? and password=?

어떤 인 자 를 입력 하 든 출력 된 SQL 은 이 렇 습 니 다.MyBatis 가 사전 컴 파일 기능 을 사용 하기 때문에 SQL 이 실행 되 기 전에 위의 SQL 을 데이터베이스 에 보 내 컴 파일 합 니 다.실행 할 때 컴 파일 된 SQL 을 사용 하여 자리 표시 자 를 바 꾸 면 됩 니 다. "?"SQL 주입 은 컴 파일 과정 에 만 작용 하기 때문에 이러한 방식 은 SQL 주입 문 제 를 잘 피 할 수 있다.
[밑바닥 실현 원리] MyBatis 는 SQL 사전 컴 파일 을 어떻게 했 나 요?사실 프레임 밑 에 서 는 JDBC 의 Prepared Statement 류 가 작용 하고 있 습 니 다. Prepared Statement 은 우리 가 잘 아 는 Statement 의 하위 클래스 입 니 다. 그 대상 은 컴 파일 된 SQL 문 구 를 포함 하고 있 습 니 다.이런 '준비' 방식 은 안전성 을 높 일 뿐만 아니 라 같은 SQL 을 여러 번 실행 할 때 효율 을 높 일 수 있다.SQL 이 컴 파일 되 었 기 때문에 다시 실행 할 때 컴 파일 할 필요 가 없습니다.
 
mapper. xml 파일 에서 sql 조회 문 구 를 다음 과 같이 가정 합 니 다.

대응 하 는 인 터 페 이 스 는:
public String findById(@param("userId")String userId);

들 어 오 는 인자 가 3 일 때;drop table user; 우리 가 실행 할 때 인쇄 된 sql 문 구 를 볼 수 있 습 니 다:
 select name from usre where id = ?;
어떤 파 라 메 터 를 입력 하 더 라 도 sql 주입 을 방지 할 수 있 습 니 다. my batis 바 텀 은 사전 컴 파일 을 실 현 했 기 때문에 바 텀 은 prepare Statement 예비 컴 파일 을 통 해 현재 들 어 오 는 sql 에 대해 사전 컴 파일 을 실 현 했 습 니 다. 그러면 sql 주입 을 방지 할 수 있 습 니 다.
검색 어 를 다음 으로 바 꾸 면:

입력 인자 가 3 이면;drop table user;  sql 문 구 를 실행 합 니 다.
select name from user where id = 3;drop table user ;
my batis 는 사전 컴 파일 문 구 를 하지 않 았 습 니 다. 먼저 문자열 을 연결 한 다음 에 사전 컴 파일 을 했 습 니 다.이 과정 은 sql 주입 이 효력 을 발생 하 는 과정 입 니 다.
따라서 my batis 의 맵 문 구 를 작성 할 때 '\ # {xxx}' 와 같은 형식 을 사용 합 니 다."${xxx}" 와 같은 인 자 를 사용 하지 않 으 면 sql 주입 공격 을 방지 하기 위해 수 동 으로 여과 작업 을 해 야 합 니 다.

좋은 웹페이지 즐겨찾기