Home
home
🏡 홈
home

[DB] SQL Injection 방지

분류
실무지식
태그
DB
작성자
작성일
2025/07/06 11:26
이스케이프 처리했지만 오류가 나는 이유는 무엇일까?

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별로 차이점이 조금씩 있는거 같은데 실무에서 많이 접해가면서 배울수 밖에 없겠다는 생각을 했습니다.