최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday

티스토리 뷰

   우리가 항상 사용하는 로그인 SQL의 기본적인 형태


SQL 삽입(영어: SQL Injection, SQL 인젝션, SQL 주입)은 응용프로그램 보안 상의 허점을 의도적으로 이용해, 


개발자가 생각치 못한 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 공격 방법이다.


다음과 같이 사용자의 아이디와 비밀번호를 확인하고 일치하면 로그인을 하는 PHP 프로그램이 있다고 하자.


$result = mysql_query("SELECT * FROM member WHERE ID='$id' AND PW='$pw'");

if(mysql_num_rows($result))

{

 // 로그인 성공

}

else

{

 // 사용자의 아이디와 비밀번호가 틀리므로 로그인 실패

}


일반적인 경우에 위 코드가 어떻게 동작할 지 예상할 수 있을 것이다.



  SQL 인젝션 공격


하지만 $id에 ' OR '1'='1' --와 같은 값이 들어간다고 하면 SQL 쿼리문은 아래와 같이 된다.


SELECT * FROM member WHERE ID='$id' OR '1'='1' -- AND PW='$pw'


결과적으로 무조건 로그인이 성공하게 된다.


기존 쿼리는 ID='$id' 다음 비밀번호를 AND로 연결하고 비교 하려 했지만 OR '1'='1' 이라는 항상 참인 명제를 붙여주고 


상단의 "--" 부호는 주석 처리 구문으로써, SQL에서 개발자가 쓴 쿼리의 나머지 부분을 무시하게 하는 일반적인 방법이다.



   SQL 인젝션 공격에 대한 필수 인코딩 - mysql_real_escape_string()



이를 해결하는 방법은 다음과 같이 $id와 $pw를 SQL에 맞게 인코딩 하면 된다.


$id = mysql_real_escape_string($id);

$pw = mysql_real_escape_string($pw);

$result = mysql_query("SELECT * FROM member WHERE ID='$id' AND PW='$pw'");

if(mysql_num_rows($result))

{

 // 로그인 성공.

}

else

{

 // 사용자의 아이디와 비밀번호가 틀리므로 로그인 실패

}


이제 $id와 $pw에 어떤 값이 들어가도 아무 문제가 발생하지 않게 된다.


SQL 삽입공격은 많은 패턴이 존재한다. 이 모든 것을 다 이해할 수 있다면 좋겠지만,


mysql_real_escape_string()을 사용하는 것 만으로도 많은 공격을 차단할 수 있다.



* 예제 인용 http://ko.wikipedia.org/wiki/SQL_%EC%82%BD%EC%9E%85






댓글