공격하려는 서버에서 로그인 관련 처리를 할때
SELECT user FROME user_table WHERE id='아이디' AND pw='비밀번호';
와 같은 쿼리문으로 동작하게 될 것이다.
일반적인 사용자는 로그인시 ID : test, PW : test1234 와 같은 일반적인 문자열을 입력할 것이다.
하지만 공격자가 ID : test, PW : ' OR '1' = '1 과 같은 내용을 입력하고 로그인을 시도했다고 했을 때, 쿼리문은
SELECT user FROME user_table WHERE id='test' AND pw='' OR '1' = '1';
과 같이 작성되어 실행될 것이다.
이렇게 된다면 '1' = '1'로 인해서 앞의 모든 내용이 만족하게 되므로 로그인이 가능하게 된다.
또한 ' or 1=1 -- 과 같은 내용을 비밀번호에 삽입해도 똑같은 결과가 나타난다.
-- 의 의미는 이후의 내용은 모두 주석이라는 뜻.
쿼리문을 사용자의 입력값과 조합하기 전에 미리 준비해 놓고, 입력값을 자동으로 변환해준 뒤 준비해 두었던 쿼리문과 합하여 실행하게 됨.
String prepareStatement = "SELECT * FROM USERS WHERE name = ? AND password =?;
PreparedStatement preparedStatement = connection.prepareStatement(prepareStatement);
preparedStatement.setString(1, loginName);
preparedStatement.setString(2, loginPassword);