자바 프로그래머 는 멍청 한 새 에서 초보 의 (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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.