세이박스

php DB 인젝션 공격 방어 본문

웹프로그램

php DB 인젝션 공격 방어

세이박스 2009. 6. 17. 17:11
인젝션 방어를 위한 처리를 하기 위해선
get, post 로 넘어오는 모든 변수중에서 DB에 사용될 변수에 대해 검수를 거친뒤에 DB에서 사용하도록 해야하나 이미 구축된 사이트에 일일이 적용하기엔 힘들 경우 아예 get, post 데이터 전체를 검사하도록 다음과 같이 구현해 봤습니다.

//인젝션 공격 막기 넘어오는 변수들 모두 검사

//GET
while(list($fildn1,$fildv1) = each($_GET)) {
  if(eregi("--",$fildv1)) {
    echo "<script>alert('[요청거절] 요청하신 값중에 사용할 수 없는 코드가 들어 있습니다.');history.back();</script>";
    exit;
  }
}

//POST
while(list($fildn2,$fildv2) = each($_POST)) {
  if(eregi("--",$fildv2)) {
    echo "<script>alert('[요청거절] 요청하신 값중에 사용할 수 없는 코드가 들어 있습니다.');history.back();</script>";
    exit;
  }
}

일단 인젝션 공격에 대표적인 문구인 "--" 하나 넣어 봤는데 필요시 "--|;|\.js" 처럼 "|"로 구분해서 추가 하면 되겠죠!
물론, 정상적인 값들까지 차단 될 수 있다는 문제가 있긴 합니다.
따라서, 차단할 패턴은 잘 선택해서 입력하세요.
그리고, ".js" 앞에 "\" 표시 붙인 이유는 "." 점이 정규식 예약어라서 무시하도록 하기 위해 "\"원화 표시를 붙여 줍니다.
정규식 예약어는 세이박스에서 조회 해서 확인 하세요!

하지만, 효율성을 위해서 사이트 구축시 처음부터 인젝션 공격을 고려해서 코딩 하세요!
이게 정답이다 할만한건 없지만 자신의 사이트에 맞는 최적화 방법이 최고 입니다.

예로 들자면 $num 이라는 변수에는 단순 숫자만 넘어와야한다면
if(eregi("[^0-9]",$num)) echo "접속차단";

이런식으로 필요하지 않는 값을 원천적으로 차단 해주는게 가장 좋습니다.
이유인즉, 최근에는 Ascii 코드 값으로 문자를 만들어 공격 하기도 합니다.
이럴경우 제가 만든 소스로는 좀 힘들겠죠...

그럼, 여러분들이 만들어 두신 좋은 차단 방법 좀 있으면 올려주세요~
화이팅!!
0 Comments
댓글쓰기 폼