[SQL] INT 형을 입력할 때도 작은 따옴표로 감싸야 한다

SQL 인젝션에 대해서 한두번 쯤은 들어 봤을 것이다.

난 많은 걸 알지는 못하기 때문에, 심심풀이로 한 번 주소 표시줄의 page=1 부분에 page=1 or 1=1 이라고 넣어 봤다. 와우~ 왠걸 그러니까 모든 글이 다 불러와 지는 것이다.

내가 만들던 것은 모든 사람의 글을 한 테이블에 저장하는 시스템이었다. 각 글 별로 게시판의 ID가 있고, 특정 게시판에서는 자기 게시판에 해당하는 글만 불러 와야 한다.

그런데, page=1 or 1=1 이라고 입력하니까 게시판 ID에 상관없이 모든 글이 불러와 졌다.

옆에 있던 친구에게 물어 봤더니 where 절에 INT형이라고 해도 따옴표를 꼭 붙여야 한다고 했다. 따옴표를 붙여도 SQL에서는 잘 인식을 하며, 그렇게 해야 저런 어이없는 공격(?)에 당하지 않는다는 것이다.

여튼간에 하나 배웠다.

참고로 PHP의 SQL Injection 방어 함수도 있다. 참고해 보면 도움이 될 거다.

카테고리 글 목록 👉

대표글

“[SQL] INT 형을 입력할 때도 작은 따옴표로 감싸야 한다”에 대한 4개의 응답

  1. 엄밀하게 말하면 쿼리를 날리기 전에 변수를 엄격하게 체크해야 합니다.
    where 절에 들어가는 조건을 쿼테이션으로 감쌀 경우 빈값이 들어왔을 때, 풀스캔 해버리게 되는 불상사도 발생할 수 있구요.

    1. 조언 감사합니다. 전 DB쪽이 정말 취약한 거 같아요. ^^;;

  2. 양파님 말씀대로 변수의 유효성 검사를 엄격하게 하는 방향이 맞는것 같습니다.
    원 포스트내용대로 INT (1)에 문자열 (‘1’)을 대입하면 자동으로 캐스팅연산되어 정상적으로 동작할 수도 있지만 모든 DATABASE 시스템에서 완벽히 동작하리라 장담할 수 없습니다. 더군다나 프로그램에 의해 유동적으로 쿼리문이 만들어지는 경우 프로그램단과 DATABASE 내에서의 데이타타입때문에 더 큰 버그가 발생할 수 있는 소지가 있습니다.

    1. 와우 조언들이 많이 있네요! ^^ 감사합니다. 더 많은 걸 알게 되는 것 같습니다.
      근데 말씀하신 것중에 “프로그램에 의해 유동적으로 쿼리문이 만들어지는 경우 프로그램단과 DATABASE 내에서의 데이타타입때문에 더 큰 버그가 발생할 수 있는 소지가 있습니다.” 이거의 예시를 하나만 들어 주실 수 있을까요? 어떤 경우인지, 무엇을 조심해야 하는지 궁금해서 그럽니다. (__)

blueruin 에 응답 남기기응답 취소