악의적인 문자열도 SQL 문법이 아닌 값으로 비교합니다.
SQL 인젝션은 사용자 문자열을 SQL 문장에 이어 붙일 때 입력 일부가 문법으로 해석되어 발생합니다. 애플리케이션에서는 placeholder가 있는 prepared statement에 값을 바인딩해 문장 구조와 입력값을 분리합니다.
실습의 request_input 행은 서버가 별도로 바인딩해 전달한 값 역할을 합니다. 악의적인 문자열을 그대로 JOIN 비교해도 관리자 행이 조회되지 않는 결과를 확인합니다.
테이블명·정렬 방향처럼 값 placeholder로 처리할 수 없는 구조는 서버의 허용 목록에서 선택합니다.
파라미터 바인딩에 쓰는 placeholder 문법은 드라이버마다 다르지만(?, %s, $1 등), '사용자 입력을 SQL 문자열에 직접 이어붙이지 않는다'는 원칙은 SQLite든 MariaDB든 PostgreSQL이든 동일합니다.
따옴표를 replace하는 자체 escape 함수는 인코딩과 DB 설정의 모든 문맥을 안전하게 처리하지 못합니다.
직접 바꿔보세요request_input을 정상 이메일로 바꿨을 때 해당 사용자 한 명만 조회되는지 확인하세요.
실행 버튼을 누르면 결과가 여기에 표시됩니다.