
우선 기존에 사용하던 mysqli 방식을 고쳐 PDO를 사용하였다.
로그인 로직을 새로 짜는 이유는 SQL injection을 막아보기 위해서다.
이전 포스팅 중 sql injection을 다뤄본적이 있다.
https://guardkim-hack-lab.tistory.com/25
SQL injection 기초 (실습)
SQL injection SQL 질의문을 삽입하는 공격 ->데이터 추출 ->인증 우회 ->데이터 변조 SQL인젝션 취약점은 웹 서버 영역의 데이터베이스로 전송되는 SQL쿼리문을 사용자가 임의로 조작할 수 있는 경우
guardkim-hack-lab.tistory.com
해당 포스팅을 보면 sql injection을 다루는데 있어 기본적인 것들이 설명되어있다.
위에 보이는 코드를 이용해서 로그인하면 sql injection의 방지가 되어있지 않기 때문에 인젝션 공격에 취약하다.
sql injection이 일어나는 이유 중 하나는 사용자가 특수문자를 사용할 수 있기 때문이다.
이를 막아주려면 어떻게 해야할까? 방법 중 하나는 php가 제공하는 함수를 이용하는 것이다.
PDO에서 사용할 수 있는 것 중 pdo statment의 바인드를 사용하면 인젝션을 막아줄 수 있다.


인젝션 공격을 하려해도 로그인이 실패되었다는 화면이 나온다.
bind_param을 이용하면 사용자가 입력한 값이 쿼리문의 일부가 될 수 없고 온전히 데이터로만 처리된다.
때문에 or나 UNION같은 키워드가 입력되어도 무의미한 문자열이 된다.
해당 방법이 가장 확실히 인젝션 공격을 막는 방법일 것이라고 생각한다.
하지만 확실하지는 않더라도 다양한 로그인 방법들을 만들어보았다.
일단 위 방법중 error문자를 출력하는 구문부터 모두 삭제해준다.
개발과정에서 에러를 확인하기위해 넣었던 에러 메세지가 해커에게있어서 유리하게 작용할 수 있다.

또한 bindParam이 아닌 binValue를 이용할 수 있다.
