이스케이프 처리했지만 오류가 나는 이유는 무엇일까?
SQL Injection이란?
•
SQL Injection은 사용자가 입력한 값이 적절히 필터링되지 않고 SQL 쿼리에 직접 삽입되어, 악의적인 쿼리 실행이 가능한 보안 취약점입니다.
•
예시 :
SELECT * FROM users WHERE username = '$username';
SQL
복사
◦
만약 username에 1 OR 1=1을 입력하면 모든 사용자가 노출될 수 있음.
MySQL에서의 이스케이프 및 addslashes 함수
•
MySQL에서는 문자열 내 특수문자를 이스케이프(escape)하여 SQL Injection을 어느 정도 방지할 수 있습니다.
•
대표적으로 PHP의 addslashes()함수가 사용됩니다.
•
작은따옴표('), 큰따옴표("), 백슬래시(), NULL 문자를 각각 ', ", \, \0 으로 변환
•
예시 :
$safe = addslashes($user_input);
$query = "SELECT * FROM users WHERE username = '$safe'";
PHP
복사
PostgreSQL에서는 addslashes가 통하지 않는 이유
•
PostgreSQL은 백슬래시() 이스케이프 방식이 표준이 아니며, 문자열 내 작은따옴표(')를 이스케이프할 때 ' → '' (싱글쿼트 2개)로 처리해야 합니다.
•
PHP의 addslashes는 작은따옴표를 '로 변환하지만, PostgreSQL에서는 \가 이스케이프 문자로 동작하지 않으므로 Injection을 막지 못합니다.
•
PostgreSQL에서는 pg_escape_string() 등 DB 전용 이스케이프 함수를 사용하거나, 가장 안전하게는 Prepared Statement(프리페어드 쿼리)를 사용해야 합니다.
DB별 이스케이프 방식 차이 요약
DBMS | 문자열 이스케이프 방식 | addslashes 사용 가능 여부 |
MySQL | ', ", \, \0 | O (제한적) |
PostgreSQL | '' (싱글쿼트 2개) | X |
Oracle | '' (싱글쿼트 2개) | X |
SQLite | '' (싱글쿼트 2개) | X |
마무리
CCMTUBE에 인코딩 오류가 생겨서 코드를 확인해보았지만,
이스케이프 처리도 잘 되어있어서 문제가 발생할 이유가 없다고 생각하며 오류를 찾고 있었어요.
문제는 pgsql을 사용중이라 이스케이프 처리에 문제가 발생한다는 것이었어요.
DB별로 차이점이 조금씩 있는거 같은데 실무에서 많이 접해가면서 배울수 밖에 없겠다는 생각을 했습니다.