SQL 주입 을 효과적으로 방지 하 는 5 가지 방법 요약

sql 주입 입문
SQL 주입 은 매우 큰 해 를 끼 치 는 공격 형식 이다.피해 가 크 지만 방 어 는 XSS 만큼 어렵 지 않다.
SQL 주입 구멍 이 존재 하 는 이 유 는 SQL 인 자 를 연결 하 는 것 입 니 다.즉,입력 에 사용 할 조회 파 라 메 터 를 SQL 구문 에 직접 연결 하여 SQL 에 구멍 을 뚫 은 것 이다.
전형 적 인 SQL 주입 을 보 여 줍 니 다.

우 리 는 보 았 다.
만약 이 문장 이 sql 문자열 을 통 해 연결 된다 면,예 를 들 어select id,no from user where id=2;그 중의 id 는 한 사용자 가 입력 한 매개 변수 입 니 다.만약 에 사용자 가 입력 한 것 이 2 라면 위 에서 하나의 데 이 터 를 찾 았 습 니 다.만약 에 사용자 가 입력 한 것 이 4.567914 이면 sql 주입 공격 을 하면 위의 문장(4.567914.)이 user 표 의 모든 기록 을 찾 아 냈 습 니 다.이것 이 바로 전형 적 인 sql 주입 이다.
한 열 더 보기:

우 리 는 sql 주입 을 통 해 표 sqlinject 를 직접 삭제 할 수 있 는 것 을 보 았 습 니 다!그 위 해 를 볼 수 있다!
SQL 주입 공격 의 총체 적 사고방식
      1,SQL 주입 위치 찾기
      2.서버 유형 과 백 엔 드 데이터베이스 유형 판단
      3.통 하지 않 는 서버 와 데이터베이스 특징 에 따라 SQL 주입 공격
SQL 주입 공격 실례
예 를 들 어 로그 인 인터페이스 에서 사용자 이름과 비밀 번 호 를 입력 해 야 합 니 다.
이렇게 입력 하여 계 정 로그 인 면제 실현:
사용자 이름:'or 1=1 C
비밀번호:로그 인 을 누 르 십시오.특별한 처 리 를 하지 않 았 다 면 이 불법 사용 자 는 만 족 스 럽 게 로그 인 했 습 니 다.(물론 현재 일부 언어의 데이터베이스 API 는 이러한 문 제 를 처 리 했 습 니 다)
왜 그 럴 까요?다음은 우리 가 분석 해 보 자.
이론 적 으로 백 스테이지 인증 프로그램 에는 다음 과 같은 SQL 문구 가 있 을 것 이다.

String sql = "select * from user_table where username=' "+userName+" ' and password=' "+password+" '";
위의 사용자 이름과 비밀 번 호 를 입력 하면 위의 SQL 문 구 는 다음 과 같 습 니 다.

SELECT * FROM user_table WHERE username=''or 1 = 1 -- and password=''
SQL 구문 분석:
조건 뒤에String sql = "select id,no from user where id=" + id;사용자 이름 이'또는 1=1 과 같 으 면 이 조건 은 반드시 성공 할 것 입 니 다.
그리고 뒤에 두 개의 주석 을 추가 합 니 다.이것 은 주석 을 의미 합 니 다.이것 은 뒤의 문 구 를 주석 하여 그들 로 하여 금 역할 을 하지 못 하 게 합 니 다.그러면 문 구 는 영원히 정확하게 실 행 될 수 있 고 사용 자 는 시스템 을 쉽게 속 이 고 합 법 적 인 신분 을 얻 을 수 있 습 니 다.
이것 은 그래도 비교적 부 드 러 운 것 이다.만약 집행 한다 면.

SELECT * FROM user_table WHERE username='' ;DROP DATABASE (DB Name) --' and password=''
...그 결 과 는 가히 짐작 할 수 있다.
대응 방법
다음은 JSP 에 대해 대처 방법 을 말씀 드 리 겠 습 니 다.
1.(간단 하면 서도 효과 적 인 방법)Prepared Statement
사전 컴 파일 된 구문 집합 을 사용 하여 SQL 주입 을 처리 하 는 능력 을 내장 하고 있 으 며,setXXX 방법 으로 값 을 전달 하면 됩 니 다.
사용 혜택:
     (1).코드 의 가 독성 과 유지 가능성.
     (2).Prepared Statement 은 가능 한 한 성능 을 향상 시 킵 니 다.
     (3).가장 중요 한 것 은 안전성 을 크게 향상 시 켰 다 는 것 이다.
원리:
sql 주입 은 sql 문장의 준비(컴 파일)과정 에 만 파괴 작용 을 합 니 다.
그리고 Prepared Statement 은 이미 준비 되 었 습 니 다.실행 단 계 는 입력 문자열 을 데이터 로 처리 할 뿐 입 니 다.
sql 문 구 를 해석 하지 않 고 준비 하기 때문에 sql 주입 문 제 를 피 할 수 있 습 니 다.
2.정규 표현 식 을 사용 하여 들 어 오 는 인 자 를 걸 러 냅 니 다.
들 여 올 가방:

import java.util.regex.*;
정규 표현 식:

private String CHECKSQL = “^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$”;
일치 여부 판단:

Pattern.matches(CHECKSQL,targerStr);
다음은 구체 적 인 정규 표현 식 입 니 다.
SQL meta-characters 를 검사 하 는 정규 표현 식: 2 or 1=1SQL meta-characters 를 검사 하 는 정규 표현 식 수정:select id,no from user where id=2 or 1=1;전형 적 인 SQL 주입 공격 의 정규 표현 식:username=”or 1=1SQL 주입 검사,UNION 검색 키워드 의 정규 표현 식:/(\%27)|(\')|(\-\-)|(\%23)|(#)/ixMS SQL Server SQL 주입 공격 을 감지 하 는 정규 표현 식:/((\%3D)|(=))[^
]*((\%27)|(\')|(\-\-)|(\%3B)|(:))/i
잠깐 만...
3.문자열 필터
비교적 통용 되 는 방법:
(||사이 의 인 자 는 자신의 프로그램의 필요 에 따라 추가 할 수 있 습 니 다)

public static boolean sql_inj(String str){

String inj_str = "'|and|exec|insert|select|delete|update|

count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";

String inj_stra[] = split(inj_str,"|");

for (int i=0 ; i < inj_stra.length ; i++ ){

if (str.indexOf(inj_stra[i])>=0){

return true;

}

}

return false;

}
4.jsp 에서 이 함 수 를 호출 하여 패키지 불법 문자 여 부 를 검사 합 니 다.
SQL 이 URL 에서 들 어 오 는 것 을 방지 합 니 다:
sql_inj.java 코드:

package sql_inj;

import java.net.*;

import java.io.*;

import java.sql.*;

import java.text.*;

import java.lang.String;

public class sql_inj{

public static boolean sql_inj(String str){

String inj_str = "'|and|exec|insert|select|delete|update|

count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";

//            

String[] inj_stra=inj_str.split("\\|");

for (int i=0 ; i < inj_stra.length ; i++ ){

if (str.indexOf(inj_stra[i])>=0){

return true;

}

}

return false;

}

}
5.JSP 페이지 판단 코드:
javascript 을 사용 하여 클 라 이언 트 에서 안전 하지 않 은 문자 차단 을 진행 합 니 다.
기능 소개:""","\","/"가 있 는 지 확인 합 니 다.
매개 변수 설명:검사 할 문자열
반환 값:0:예 1:아니오
함수

function check(a){

return 1;

fibdn = new Array (”‘” ,”\\”,”/”);

i=fibdn.length;

j=a.length;

for (ii=0; ii<i; ii++)

{ for (jj=0; jj<j; jj++)

{ temp1=a.charAt(jj);

temp2=fibdn[ii];

if (tem'; p1==temp2)

{ return 0; }

}

}

return 1;

}
전체적으로 말 하면 일반적인 SQL 주입 을 예방 하기 위해 코드 규범 에 만 신경 을 쓰 면 된다.
실 행 된 SQL 에 변수 가 있 을 때 JDBC(또는 다른 데이터 영구 층)로 제공 하 는 예 를 들 어 Prepared Statement 을 사용 하면 됩 니 다.문자열 을 맞 추 지 않 는 방법 을 기억 하 시 면 됩 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기