PHP addslashes() 함수를 이용한 작은따옴표 데이터 삽입 및 SQL 이스케이프 처리
페이지 정보

본문
그누보드 운영 및 PHP 개발 시 데이터에 포함된 작은따옴표로 인해 발생하는 SQL 쿼리 문법 오류를 방지하고 안전하게 DB에 저장·출력하는 방법을 알아봅니다.
작은따옴표로 인한 SQL 구문 에러 원인
데이터베이스 시스템은 쿼리를 작성할 때 작은따옴표('), 큰따옴표("), 백슬래시(/), NULL byte 등을 문자열을 구분하는 기준으로 이용합니다. 이때 하나의 문자열 안에 작은따옴표가 들어가게 되면, DB 시스템이 이를 문자열의 시작이나 끝으로 오인하여 예상치 못한 구문 오류가 발생하게 됩니다.
PHP addslashes() 함수를 이용한 SQL 이스케이프 처리
데이터베이스에 데이터를 저장할 때 문자열 내에 작은따옴표(')가 포함되어 있으면 SQL 쿼리 구분자와 충돌하여 구문 오류가 발생할 수 있습니다. 이를 방지하기 위해 addslashes() 함수를 사용하여 따옴표 앞에 백슬래시를 추가하는 이스케이프 처리를 수행합니다.
1. addslashes() 함수 사용법
addslashes() 함수는 작은따옴표('), 큰따옴표("), 백슬래시(), NULL 바이트 앞에 백슬래시를 붙여 안전한 포맷으로 변환합니다.
- 적용 방법:
$name = addslashes($name);와 같이 데이터베이스 저장 전 변수에 적용합니다. - 기능: 문자열 내의 특정 문자를 이스케이프하여 데이터베이스가 해당 문자를 쿼리 구분자가 아닌 일반 데이터로 인식하게 합니다.
2. 데이터 출력 시 처리 (stripslashes)
데이터베이스에서 데이터를 다시 불러와 화면에 출력할 때는 addslashes()로 인해 추가된 백슬래시를 제거해야 원래의 문자열이 표시됩니다.
- 적용 방법:
echo stripslashes($row['name']);와 같이 출력 시 사용합니다.
3. magicquotesgpc 설정 확인
PHP 설정 중 magic_quotes_gpc가 활성화되어 있으면 GET, POST, COOKIE 데이터에 자동으로 이스케이프 처리가 적용됩니다.
- 확인 방법:
get_magic_quotes_gpc()함수를 사용하여 설정 상태를 확인합니다. 이 함수가FALSE를 반환하면 수동으로addslashes()처리를 적용해야 합니다.
주의: 최신 PHP 버전에서는 magic_quotes_gpc 기능이 폐기되었을 수 있으므로, 서버 환경을 먼저 확인하는 것이 좋습니다.
데이터베이스 출력 시 백슬래시 제거 방법
데이터베이스에 저장할 때 addslashes() 함수 등으로 인해 작은따옴표 앞에 추가된 백슬래시(\)를 제거하여 원래의 문자열 형태로 화면에 출력하려면 stripslashes() 함수를 사용해야 합니다.
함수 사용법
stripslashes() 함수는 addslashes() 등으로 인해 문자열에 추가된 백슬래시를 제거해주는 역할을 합니다.
string stripslashes ( string $str )
적용 예시
$str = "my name is \'jelly\'";
echo stripslashes($str);
// 출력 결과: my name is 'jelly'
데이터베이스에서 데이터를 다시 꺼내와 화면이나 브라우저에 출력할 때 stripslashes($str)를 거치면 추가되었던 백슬래시가 제거되어 사용자가 입력했던 원래의 깨끗한 문자열 형태(')로 출력됩니다.
magicquotesgpc 설정 확인과 이스케이프 처리
PHP 환경에서 magic_quotes_gpc 설정은 GET, POST, COOKIE를 통해 넘어오는 값들에 대해 자동으로 이스케이프 처리를 수행해 주는 기능입니다. 이 설정값은 PHP 파일 내에서 임의로 세팅할 수 없으며 서버 관리자가 PHP를 설치할 때 혹은 이후에 설정하게 됩니다.
설정 여부 확인 방법
현재 magic_quotes_gpc가 설정되어 있는지는 get_magic_quotes_gpc() 함수를 통해 알아낼 수 있습니다.
bool get_magic_quotes_gpc ( void )
이 함수가 FALSE를 리턴하면 설정이 되어 있지 않다는 뜻입니다.
이스케이프 처리를 다르게 해야 하는 이유
- 설정되어 있는 환경: 입력값에 자동으로 백슬래시가 추가되므로, 개발자가 코드에서 임의로
addslashes()등의 이스케이프 처리를 중복해서 적용할 경우 백슬래시가 겹쳐서 들어가거나 데이터가 변형될 수 있습니다. - 설정되어 있지 않은 환경 (
FALSE리턴): 자동 이스케이프가 동작하지 않으므로, 데이터베이스에 저장하기 전에 개발자가 직접addslashes()함수 등을 사용하여 작은따옴표 등의 특수문자를 이스케이프 처리해야 SQL 구문 에러를 방지할 수 있습니다.
참고사항: 최신 PHP 버전에서의
magic_quotes_gpc폐기 여부는 레거시 자료에 해당하므로, 운영 중인 서버의 PHP 버전에 맞춰 해당 설정의 활성화 여부를get_magic_quotes_gpc()로 먼저 점검한 뒤 코드를 적용해야 합니다.
AJAX 및 폼 전송 시 작은따옴표 이스케이프 중첩 문제 해결
AJAX나 폼 전송 과정에서 작은따옴표가 포함된 문자열을 전달할 때 슬래시가 중첩되어 where ca_name = \'홍보\' 또는 \\'홍보\\'와 같이 백슬래시가 과도하게 붙는 현상이 발생할 수 있습니다.
확인 및 대처 위치
- AJAX 요청 데이터를 생성하는 자바스크립트 변수 선언부 및 전송 직전의 문자열 조합 상태를 확인합니다.
- 서버로 전달된 값을 받는 PHP 파일에서
addslashes()나stripslashes()가 중복으로 적용되고 있는지 확인합니다.
다음 행동
- 전송 데이터에 백슬래시가 불필요하게 늘어나는 경우, 자바스크립트 측에서 문자열을 인코딩하거나 서버로 넘어가기 전의 형태를 콘솔(
console.log) 등으로 먼저 확인합니다. - 서버단 코드에서 이미 이스케이프 처리된 값에
addslashes()가 중복 적용되고 있다면 해당 처리를 점검합니다.
상황별 판단 및 대응 가이드
| 내 상황 | 선택 기준 | 다음 행동 |
|---|---|---|
| SQL 쿼리 실행 시 작은따옴표로 인한 구문 오류 발생 | 데이터 저장 전 이스케이프 처리 필요 | addslashes() 함수를 사용하여 데이터 저장 전 변수 처리 |
DB에서 불러온 데이터에 백슬래시(`)가 포함되어 출력됨 | 출력 시 백슬래시 제거 필요 | stripslashes()` 함수를 사용하여 화면 출력 전 데이터 복원 | ||
| 서버 환경의 자동 이스케이프 설정 여부 확인 | magic_quotes_gpc 활성화 상태 점검 | get_magic_quotes_gpc() 함수로 상태 확인 후 수동 처리 여부 결정 |
실전 FAQ
Q. 데이터베이스 저장 시 작은따옴표로 인한 오류를 방지하는 다른 방법은 없나요?
- 대안:
addslashes()외에도 쿼리 작성 시 작은따옴표를 두 번 입력('')하여 이스케이프할 수 있습니다. 다만, 코드 유지보수와 보안을 위해 가급적addslashes()또는 DB 드라이버에서 제공하는 이스케이프 함수 사용을 권장합니다.
Q. AJAX로 데이터를 전송할 때 백슬래시가 중첩되어 나타납니다.
- 예외 상황: AJAX 전송 시 데이터가 이미 이스케이프된 상태에서 서버 측에서 다시
addslashes()를 적용하면 슬래시가 중첩됩니다. 전송 전 데이터 형태를console.log로 확인하고, 서버 측 수신 로직에서 중복 적용 여부를 점검하십시오.
Q. magic_quotes_gpc가 비활성화된 환경에서의 주의사항은 무엇인가요?
- 실행 중 막히는 점: 해당 설정이
FALSE인 환경에서는 자동 이스케이프가 동작하지 않으므로, 모든 사용자 입력값에 대해 수동으로addslashes()를 적용하지 않으면 SQL 인젝션 및 구문 오류에 취약해집니다.
함께 보면 좋은 글
참고자료
기타 참고자료
- 이전글PHP 문자열 공백 제거 방법 (trim, pregreplace) 26.09.30
- 다음글PHP 입력값 유효성 검사 및 타입 검증 가이드 26.09.30
댓글목록
등록된 댓글이 없습니다.