mysql_real_escape_string란?
PHP에서 오랫동안 사용되어 온 mysql_real_escape_string 함수는 SQL 쿼리에 삽입되는 문자열 내 특수 문자를 이스케이프 처리하는 역할을 합니다. 하지만 이 함수에는 몇 가지 중요한 단점이 존재합니다.
주요 단점
가장 큰 문제는 현대적인 API 환경에서 프리페어드 스테이트먼트(prepared statement)를 작성할 때 드러납니다. 또한 값에 타입캐스팅(typecasting)을 적용하는 경우, 모든 형태의 공격으로부터 안전하지 않다는 추가적인 한계가 있습니다.
MySQL에서 타입캐스팅 구문 예시
(TypeCast)mysql_real_escape_string($_REQUEST['anyColumnName']);
위 구문처럼 타입캐스팅을 함께 사용하더라도, 가능한 모든 공격 벡터로부터 완전히 안전하다고 볼 수 없습니다.
기타 문제점
- 타입 안전성(type safety)이 보장되지 않습니다.
- SQL 인젝션(injection) 공격에 대한 완벽한 방어 수단이 되지 못합니다.
권장 대안
참고로 mysql_real_escape_string은 PHP 5.5.0부터 지원이 중단(deprecated)되었으며, PHP 7.0에서는 완전히 제거되었습니다. 따라서 신규 프로젝트에서는 mysqli 확장 또는 PDO를 사용해 프리페어드 스테이트먼트를 활용하는 것이 훨씬 안전하고 바람직합니다. 프리페어드 스테이트먼트는 SQL 구문과 데이터를 분리하기 때문에 이스케이프 처리 방식보다 근본적으로 더 강력한 보안성을 제공합니다.