php고수님께 여쭙니다. sql 인젝션과 addslashes( ) 를 더 상세하게 파고들어가면
본문
여기 저기 아무리 찾아봐도 자세한 내용이 없어서 질문드립니다.
sql 인젝션 대응을 하기 위에 addslashes ( ) 함수를 흔히 이용하는데,
백슬래쉬를 ', ",/, 등 앞에 추가시키는 escape 기능을 하면, 그것이 정확히 어떻게 sql 인젝션을 막는건가요?
예를 들어,
어느 해커가 db에 sql인젝션을
SELECT full_name AND password WHERE user_name='bla' OR '1'='1'
이렇게 수정하였다 치면,
제가 그것을 방지하고자 addslashes( )를
addslashes([$_POST('user_name')]);
addslashes([$_POST('password')]);
이렇게 설정한다고 하여도,
SELECT full_name AND password WHERE user_name=/'bla/' OR /'1/'=/'1/'
가 되어, /'1/'=/'1/' 가 성립이 되어 결국에는 유출이 되고 말지 않나요??
어느분이 좀 속시원한 답변 좀 해주셨으면 정말 감사드리겠습니다.
답변 1
전 고수는 아니고 제가 아는 범위내에서 설명드릴께요.
일단 addslashes 과 magic_qoutes_gpc 에 대해서만 설명드립니다.
addslashes() 함수는
싱글쿼트('), 더블쿼트("), 백슬래시(\) 같은 문자앞에 백슬래시(\)를 붙여서 SQL에서 처리할 때 문자열로 인식하게 하는 함수입니다.
magic_qoutes_gpc 는
php환경에서 자동으로 addslashes를 실행시킨 효과를 줍니다.
쿼리문이 select * from member where user_name='$user_name' and password='$password' 로 되어있다면 해당 POST 값이 아래와 같다면
$_POST['user_name'] = "홍길동"; // 홍길동
$_POST['password'] = "1111' or 1='1"; // 1111' or 1='1
ex) magic_qoutes_gpc 가 off로 가정합니다.
1. addslashes 사용안함
$user_name = $_POST['user_name']; ==> 홍길동
$password = $_POST['password']; ==> 1111' or 1='1
select * from member where user_name='홍길동' and password='1111' or 1='1'
결과 member 테이블 전체출력
2. addslashes 사용함
$user_name = addslashes($_POST['user_name']); ==> 홍길동
$password = addslashes($_POST['password']); ==> 1111\' or 1=\'1
select * from member where user_name='홍길동' and password='1111\' or 1=\'1'
결과 member 테이블 출력없음
ex) magic_qoutes_gpc 가 on로 가정합니다.
1. addslashes 사용안함
$user_name = $_POST['user_name']; ==> 홍길동
$password = $_POST['password']; ==> 1111\' or 1=\'1
select * from member where user_name='홍길동' and password='1111\' or 1=\'1'
결과 member 테이블 출력없음
2. addslashes 사용함
$user_name = addslashes($_POST['user_name']); ==> 홍길동
$password = addslashes($_POST['password']); ==> 1111\\\' or 1=\\\'1
select * from member where user_name='홍길동' and password='1111\\\' or 1=\\\'1'
결과 member 테이블 출력없음
addslashes 과 magic_qoutes_gpc 만으로 SQL 인젝션 공격을 막았다고 볼 수는 없습니다.
우회하는 방법도 존재하니까요.
mysql 에서도 mysql_real_escape_string 함수로 SQL 인젝션을 방지하는 법이 있으니 따로 공부해보시고.
mysql_real_escape_string 도 우회하는 방법이 존재할꺼에요..
프로시져를 사용하는 것도 보안에 도움이 될꺼에요.
때문에 가급적 addslashes 와 trim 을 같이 쓰시고 넘겨받는 변수값에 대해서 특수문자, DB에서 사용하는 명령어 등을 체크하는 함수를 하나 만드셔서 체크하시는 것도 좋은 방법입니다.
저도 완벽하게 숙지하고 있지는 않기 때문에 원하시는 결과를 얻으시려면 추가적으로 공부해 보세요...
구글링을 통해서 "php 인젝션 방어" 혹은 "php 인젝션 공격" 등를 통해서 검색해 보시면 보다 다양한 방법들이 있을 꺼에요...