일반적인 로그인 쿼리:
SELECT * FROM users WHERE username = '사용자입력' AND password = '사용자입력';
만약 사용자가 username에 ' OR '1'='1 을 입력한다면?
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '...';
처럼 변하게 됨. '1'='1'은 항상 True 이므로, 로그인 절차 우회 가능
특정 사용자 정보를 조회하는 쿼리에서, 공격자가 입력값에
'; DROP TABLE users; --
같은 코드를 삽입하면, 원래 의도했던 조회 쿼리 뒤에 데이터베이스 테이블을 삭제하는 명령어가 추가되어 데이터 손실이 발생할 수 있음.
입력값 검증 및 정규화:
모든 사용자 입력은 허용된 형식과 범위 내에 있는지 확인해야 함.
이메일 주소나 숫자 등 예상되는 형태의 데이터만 허용하도록 체크해야 함
파라미터화된 쿼리(Prepared Statement) 사용:
SQL 쿼리를 미리 컴파일하고, 사용자 입력은 별도의 파라미터로 전달하는 방식으로 처리해야 함
이 방식은 입력값이 SQL 코드로 해석되지 않게 함.
저장 프로시저 사용:
저장 프로시저를 활용하면, 미리 정의된 SQL 문을 호출하는 형태가 되어 직접 쿼리 문자열을 구성하는 위험을 줄일 수 있음.
최소 권한 원칙 적용:
데이터베이스 사용자에게 꼭 필요한 권한만 부여하여, 설령 SQL 인젝션 공격이 성공하더라도 피해 범위를 제한할 수 있음.
보안 모니터링 및 로그 분석:
비정상적인 쿼리 실행이나 의심스러운 로그인을 탐지하기 위한 모니터링 체계를 구축하면, 공격 시도를 조기에 발견하고 대응할 수 있음.
궁금하신 점이나, 잘못된 정보가 있다면 댓글로 알려주세요. 감사합니다!
Blind SQLI와 SQLI 차이점도 알려 주세요 ~