Skip to Content
Go Back
안형우

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

📌 워드프레스, 답답한 빌더와 플러그인 대신 시원하게 커스터마징하기(강의) 2023-01-15
📌 아무도 말하지 않는 PHP의 좋은 점 2018-10-13
📌 유지보수하기 쉬운 CSS 전략(슬라이드) 2016-12-20
📌 워드프레스 테마에서 템플릿 파일 매칭 순서 2013-05-12

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

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

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

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

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

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

여튼간에 하나 배웠다.

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

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

댓글 (4개)

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

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

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

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다