자바 프로그래머 는 멍청 한 새 에서 초보 의 (102) sql 주입 공격 상세 해석 (3) sql 주입 해결 방법...

앞의 블 로그 에서 우 리 는 상세 하 게 소개 했다.
sql 주입 공격 상세 설명 (2) sql 주입 과정 상세 설명
sql 주입 공격 상세 해석 (1) sql 주입 원리 상세 설명
우 리 는 sql 주입 원리 와 sql 주입 과정 을 이 해 했 습 니 다. 오늘 우 리 는 sql 주입 의 해결 방법 을 알 아 보 겠 습 니 다.sql 주입 을 어떻게 해결 하고 예방 합 니까? 저 는 주로 자바 웹 개발 을 하 는 작은 프로그래머 이기 때문에 자바 웹 에 대한 방지 방법 만 말씀 드 리 겠 습 니 다.사실 다른 것 에 대해 서 는 생각 이 기본적으로 비슷 하 다.다음은 웹 프로그램의 측면 에서 sql 주입 을 피 하 는 방법 을 살 펴 보 겠 습 니 다.
1. 일반 사용자 와 시스템 관리자 사용자 의 권한 은 엄격 한 구분 이 있어 야 합 니 다.
일반 사용자 가 검색 어 에 다른 DropTable 문 구 를 삽입 하면 실행 할 수 있 습 니까?Drop 문 구 는 데이터베이스 의 기본 대상 과 관련 되 기 때문에 이 문 구 를 조작 하려 면 사용자 에 게 관련 권한 이 있어 야 합 니 다.권한 디자인 에서 단말 사용자, 즉 응용 소프트웨어 의 사용자 에 게 데이터베이스 대상 의 구축, 삭제 등 권한 을 줄 필요 가 없다.그러면 SQL 문 구 를 사용 하 는 데 끼 워 넣 은 악성 코드 가 있 더 라 도 사용자 권한 의 제한 으로 인해 이 코드 들 은 실 행 될 수 없습니다.따라서 응용 프로그램 을 디자인 할 때 시스템 관리자 의 사용 자 를 일반 사용자 와 구분 하 는 것 이 좋 습 니 다.이렇게 하면 주입식 공격 이 데이터베이스 에 미 치 는 위 해 를 최대한 줄 일 수 있다.
2. 매개 변수 화 문 구 를 강제로 사용 합 니 다.
SQL 문 구 를 작성 할 때 사용자 가 입력 한 변 수 는 SQL 문 구 를 직접 삽입 하 는 것 이 아 닙 니 다.매개 변 수 를 통 해 이 변 수 를 전달 하면 SQL 주입 식 공격 을 효과적으로 예방 치료 할 수 있 습 니 다.즉, 사용자 의 입력 이 SQL 문장 에 직접 삽입 되 어 서 는 안 된다 는 것 이다.이와 반대로 사용자 가 입력 한 내용 을 필터 하거나 매개 변수 화 된 문 구 를 사용 하여 사용자 가 입력 한 변 수 를 전달 해 야 합 니 다.매개 변수 화 된 문 구 는 사용자 의 입력 변 수 를 SQL 구문 에 삽입 하 는 것 이 아니 라 파 라 메 터 를 사용 합 니 다.이런 조 치 를 취하 면 대부분의 SQL 주입식 공격 을 근절 할 수 있다.안 타 깝 게 도 현재 매개 변수 화 문 구 를 지원 하 는 데이터베이스 엔진 은 많 지 않다.그러나 데이터베이스 엔 지 니 어 는 제품 을 개발 할 때 가능 한 한 매개 변수 화 문 구 를 사용 해 야 한다.
3. 사용자 입력 에 대한 검증 을 강화한다.
전체적으로 보면 SQL 주입 식 공격 을 예방 치료 하 는 데 두 가지 방법 을 사용 할 수 있다. 하 나 는 사용자 의 입력 내용 에 대한 검사 와 검증 을 강화 하 는 것 이다.둘째, 사용자 가 입력 한 내용 을 전달 하기 위해 매개 변수 화 문 구 를 강제로 사용 하 는 것 이다.SQLServer 데이터베이스 에는 비교적 많은 사용자 가 내용 검증 도 구 를 입력 하여 관리자 가 SQL 주입식 공격 에 대처 하 는 데 도움 을 줄 수 있다.문자열 변수의 내용 을 테스트 하고 필요 한 값 만 받 습 니 다.바 이 너 리 데이터, 전의 시퀀스, 주석 문 자 를 포함 하 는 입력 내용 을 거부 합 니 다.이것 은 스 크 립 트 의 주입 을 방지 하고 일부 버퍼 의 넘 침 공격 을 방지 하 는 데 도움 이 된다.사용자 가 입력 한 내용 의 크기 와 데이터 형식 을 테스트 하고 적당 한 제한 과 변환 을 강제 합 니 다.이것 은 의도 적 으로 발생 한 버퍼 가 넘 치 는 것 을 방지 하 는 데 도움 이 되 고 주입 식 공격 을 예방 하 는 데 비교적 뚜렷 한 효과 가 있다.
4. SQLServer 데이터베이스 자체 의 안전 매개 변 수 를 많이 사용 합 니 다.
주입식 공격 이 SQLServer 데이터베이스 에 미 치 는 나 쁜 영향 을 줄 이기 위해 SQLServer 데이터베이스 에 상대 적 으로 안전 한 SQL 파 라미 터 를 전문 적 으로 설계 하 였 다.데이터 베 이 스 를 설계 하 는 과정 에서 엔 지 니 어 는 이러한 매개 변 수 를 사용 하여 악의 적 인 SQL 주입 식 공격 을 근절 해 야 한다.
5. 다 층 환경 에서 SQL 주입 식 공격 을 어떻게 예방 치료 합 니까?
다 중 응용 환경 에서 사용자 가 입력 한 모든 데 이 터 는 검증 후에 야 신뢰 할 수 있 는 영역 에 들 어 갈 수 있 습 니 다.검증 과정 을 통과 하지 않 은 데 이 터 는 데이터베이스 에 의 해 거부 되 고 잘못된 정 보 를 이전 층 으로 되 돌려 야 합 니 다.다 층 검증 을 실현 하 다.목적 없 는 악의 적 인 사용자 에 대한 예방 조 치 는 확고 한 공격 자 에 게 무효 가 될 수 있다.더 좋 은 방법 은 사용자 인터페이스 와 모든 신뢰 경 계 를 뛰 어 넘 는 후속 점 에서 입력 을 검증 하 는 것 이다.클 라 이언 트 응용 프로그램 에서 데 이 터 를 검증 하면 간단 한 스 크 립 트 주입 을 방지 할 수 있 습 니 다.그러나 다음 층 에서 입력 이 검증 을 통과 했다 고 판단 되면 클 라 이언 트 를 돌아 갈 수 있 는 악성 사용 자 는 제한 없 이 시스템 에 접근 할 수 있다.따라서 다 층 응용 환경 에 대해 주입 식 공격 을 방지 할 때 각 층 이 함께 노력 해 야 한다. 클 라 이언 트 와 데이터 베이스 에서 해당 하 는 조 치 를 취해 SQL 문장의 주입 식 공격 을 예방 해 야 한다.
6. 필요 한 경우 전문 적 인 구멍 스 캔 도 구 를 사용 하여 공격 당 할 수 있 는 점 을 찾 습 니 다.
전문 적 인 구멍 스 캔 도 구 를 사용 하면 관리자 가 SQL 주입 식 공격 을 받 을 수 있 는 점 을 찾 는 데 도움 을 줄 수 있 습 니 다.그러나 구멍 스 캔 도 구 는 공격 점 만 발견 할 수 있 을 뿐 SQL 주입 공격 을 방어 하 는 역할 을 하지 못 한다.물론 이 도 구 는 공격 자 들 에 게 도 자주 사용 된다.만약 공격 자가 이 도 구 를 이용 하여 공격 목 표를 자동 으로 검색 하여 공격 을 실시 할 수 있다.이 를 위해 필요 한 경우 기업 들 은 전문 적 인 구멍 스 캔 도구 에 투자 해 야 한다.완벽 한 구멍 스 캔 프로그램 은 네트워크 스 캔 프로그램 과 달리 데이터베이스 에 있 는 SQL 주입 식 구멍 을 전문 적 으로 찾 습 니 다.최신 구멍 스 캔 프로그램 은 최근 에 발 견 된 구멍 을 찾 을 수 있 습 니 다.따라서 전문 적 인 도 구 를 통 해 관리자 에 게 SQL 주입 식 구멍 을 발견 하고 관리자 에 게 적 극적인 조 치 를 취해 SQL 주입 식 공격 을 예방 하도록 일 깨 워 줄 수 있다.공격 자가 발견 할 수 있 는 SQL 주입 식 구멍 데이터베이스 관리자 가 모두 발견 하고 적 극적인 조 치 를 취해 구멍 을 막 았 다 면 공격 자 도 손 을 쓸 수 없 었 을 것 이다.
위 에 서 는 주로 웹 응용 프로그램 에서 sql 주입 에 대한 대체적인 해결 방향 을 소개 하 였 으 며, 아래 에 서 는 자바 웹 응용 프로그램의 특징 에 따라 자바 웹 응용 프로그램 에서 의 sql 주입 문 제 를 어떻게 해결 하 는 지 구체 적 으로 설명 하 였 다.
1. 사전 컴 파일 된 구문 집합 을 사용 하여 SQL 주입 을 처리 하 는 능력 을 내장 하고 setXXX 방법 으로 값 을 전달 하면 됩 니 다.
사용 혜택:
(1). 코드 의 가 독성 과 유지 가능성.
(2). Prepared Statement 은 가능 한 한 성능 을 향상 시 킵 니 다.
(3). 가장 중요 한 것 은 안전성 을 크게 향상 시 켰 다 는 것 이다.
String sql= "select * from users where username=? and password=?;
          PreparedStatement preState = conn.prepareStatement(sql);
          preState.setString(1, userName);
          preState.setString(2, password);
          ResultSet rs = preState.executeQuery(); 

원리: sql 주입 은 sql 문장의 준비 (컴 파일) 과정 에 만 파괴 적 인 역할 을 합 니 다. Prepared Statement 은 이미 준비 되 었 습 니 다. 실행 단 계 는 입력 문자열 을 데이터 로 처리 할 뿐 sql 문 구 를 분석 하지 않 고 준비 하지 않 기 때문에 sql 주입 문 제 를 피 할 수 있 습 니 다.
2. 정규 표현 식 을 사용 하여 들 어 오 는 인 자 를 걸 러 냅 니 다.
정규 표현 식:
privateStringCHECKSQL=“^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$”;
일치 여부 판단:
Pattern.matches(CHECKSQL,targerStr);
다음은 구체 적 인 정규 표현 식 입 니 다.
SQLmeta - characters 의 정규 표현 식 검사:
/(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix
SQLmeta - characters 를 검사 하 는 정규 표현 식 수정: / (\% 3D) | (=) [^] * (\% 27) | (\) | (\ - \ -) | (\% 3B) | (:) / i
전형 적 인 SQL 주입 공격 의 정규 표현 식: / \ w * (\% 27) | (\% 6F) | o | (\% 4F) (\% 72) | r | (\% 52) / ix
SQL 주입 검사, UNION 검색 키워드 의 정규 표현 식: / (\% 27) | (\) union / ix (\% 27) | (\)
MSSQLServerSQL 주입 공격 의 정규 표현 식 검사:
/exec(\s|\+)+(s|x)p\w+/ix
잠깐 만...
사실 replace 방법 을 간단하게 사용 할 수도 있 고 항소 기능 도 실현 할 수 있 습 니 다.
publicstaticStringTransactSQLInjection(Stringstr){returnstr.replaceAll(".*([';]+|(--)+).*","");}
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;
}

안전성 에 대해 본 고 는 몇 가 지 를 요약 할 수 있다.
1. 사용자 가 입력 한 내용 에 대해 경계해 야 한다.2. 클 라 이언 트 에서 만 입력 검증 을 하 는 것 은 검증 되 지 않 은 것 과 같다.3. 서버 오류 정 보 를 사용자 에 게 노출 시 키 지 마 세 요.
주석: 본 고 는 인터넷 의 일부 자원 을 참고 하여 작성 할 때 출처 를 기록 하지 않 았 기 때문에 밝 힐 수 없습니다. 또한 본 고 는 독자 가 공부 하 는 데 만 사용 할 수 있 습 니 다. 법률 에 위반 되 는 일 을 하지 마 십시오. 일단 발생 하면 본인 과 무관 합 니 다.
------------------------------------------------------------------------------------------------------------------------
광고: 2012 년도 IT 블 로그 대회 에 참 가 했 습 니 다. 많은 응원 부탁드립니다.

  • http://blog.51cto.com/contest2012/3545281
    ------------------------------------------------------------------------------------------------------------
    《 자바 프로그래머 는 멍청 한 새 에서 초보 로 》 전자 판 책 이 정식으로 발표 되 었 으 니, 여러분 의 다운 로드 를 환영 합 니 다.
    http://blog.csdn.net/csh624366188/article/details/7999247

    좋은 웹페이지 즐겨찾기