SQL 인젝션에 대해서 한두번 쯤은 들어 봤을 것이다.
난 많은 걸 알지는 못하기 때문에, 심심풀이로 한 번 주소 표시줄의 page=1 부분에 page=1 or 1=1 이라고 넣어 봤다. 와우~ 왠걸 그러니까 모든 글이 다 불러와 지는 것이다.
내가 만들던 것은 모든 사람의 글을 한 테이블에 저장하는 시스템이었다. 각 글 별로 게시판의 ID가 있고, 특정 게시판에서는 자기 게시판에 해당하는 글만 불러 와야 한다.
그런데, page=1 or 1=1 이라고 입력하니까 게시판 ID에 상관없이 모든 글이 불러와 졌다.
옆에 있던 친구에게 물어 봤더니 where 절에 INT형이라고 해도 따옴표를 꼭 붙여야 한다고 했다. 따옴표를 붙여도 SQL에서는 잘 인식을 하며, 그렇게 해야 저런 어이없는 공격(?)에 당하지 않는다는 것이다.
여튼간에 하나 배웠다.
참고로 PHP의 SQL Injection 방어 함수도 있다. 참고해 보면 도움이 될 거다.
엄밀하게 말하면 쿼리를 날리기 전에 변수를 엄격하게 체크해야 합니다.
where 절에 들어가는 조건을 쿼테이션으로 감쌀 경우 빈값이 들어왔을 때, 풀스캔 해버리게 되는 불상사도 발생할 수 있구요.
조언 감사합니다. 전 DB쪽이 정말 취약한 거 같아요. ^^;;
양파님 말씀대로 변수의 유효성 검사를 엄격하게 하는 방향이 맞는것 같습니다.
원 포스트내용대로 INT (1)에 문자열 (‘1’)을 대입하면 자동으로 캐스팅연산되어 정상적으로 동작할 수도 있지만 모든 DATABASE 시스템에서 완벽히 동작하리라 장담할 수 없습니다. 더군다나 프로그램에 의해 유동적으로 쿼리문이 만들어지는 경우 프로그램단과 DATABASE 내에서의 데이타타입때문에 더 큰 버그가 발생할 수 있는 소지가 있습니다.
와우 조언들이 많이 있네요! ^^ 감사합니다. 더 많은 걸 알게 되는 것 같습니다.
근데 말씀하신 것중에 “프로그램에 의해 유동적으로 쿼리문이 만들어지는 경우 프로그램단과 DATABASE 내에서의 데이타타입때문에 더 큰 버그가 발생할 수 있는 소지가 있습니다.” 이거의 예시를 하나만 들어 주실 수 있을까요? 어떤 경우인지, 무엇을 조심해야 하는지 궁금해서 그럽니다. (__)