본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP addslashes — 따옴표 이스케이프 완전 정리

by 왕진 2026. 6. 14.
반응형

 

 

Web Development · PHP addslashes

PHP addslashes —
따옴표 앞에 백슬래시 붙이기

"사과","귤" → \"사과\",\"귤\" 로 이스케이프 처리하는 함수
시작 오늘 분석할 코드

문자열 안에 들어 있는 따옴표(")를 안전하게 처리하기 위해 백슬래시를 자동으로 붙여주는 함수다. 옛날 PHP 코드에서는 SQL 쿼리·자바스크립트 출력 등에 자주 사용됐다.

<?php $string = '"사과","귤","감","밤"'; $result = addslashes($string); // 따옴표·역슬래시 앞에 백슬래시(\)를 자동으로 붙임 print $result; ?>
실제 출력 결과
\"사과\",\"귤\",\"감\",\"밤\"
※ 원본 메모의 "원화로 표기"는 잘못된 설명이다. 백슬래시(\)는 윈도우 한국어 글꼴에서 ₩(원화)로 보일 뿐, 같은 기호다 (코드값 0x5C). 의미는 "이스케이프 문자".
용어 용어 정리
addslashes()특수 문자 앞에 백슬래시를 붙이는 PHP 내장 함수
백슬래시 (\)한국 글꼴에서 ₩로 보임. 영문은 \
이스케이프특수 의미를 가진 문자를 일반 문자로 처리
큰따옴표 "문자열 시작·끝을 표시하는 기호
작은따옴표 '또 다른 문자열 경계 기호
stripslashes()addslashes의 반대 — 백슬래시 제거
SQL 인젝션따옴표를 악용한 DB 공격
prepared statement현대 SQL 안전 처리 표준

1 따옴표가 왜 문제인가?

PHP·SQL·자바스크립트 모두 따옴표(' ")로 문자열을 감싼다. 만약 문자열 안에 따옴표가 또 들어가 있으면, 어디가 끝인지 헷갈려 오류가 나거나 보안 사고가 생긴다.

// SQL 예 — 이름이 "John's"인 사람을 찾는다 $name = "John's"; $sql = "SELECT * FROM users WHERE name = '$name'"; // → "SELECT * FROM users WHERE name = 'John's'" // ^^ 여기가 문자열 끝! // s' 이후는 SQL 문법 오류

이런 경우 따옴표 앞에 백슬래시를 붙여 "이건 일반 문자야, 문자열 종료 기호 아니야"라고 알려줘야 한다.


2 addslashes()가 처리하는 4가지
입력 문자 변환 결과 의미
' (작은따옴표) \' 작은따옴표 이스케이프
" (큰따옴표) \" 큰따옴표 이스케이프
\ (백슬래시) \\ 백슬래시 자체 이스케이프
\0 (NULL 바이트) \0 NULL 문자 처리

3 입력과 출력 비교
입력 (메모리 안)
"사과","귤","감","밤"
큰따옴표 8개 포함
(7글자 짜리 문자열 4개 + 콤마 3개)
addslashes 후
\"사과\",\"귤\",\"감\",\"밤\"
각 따옴표 앞에 \ 추가
총 길이 +8 글자
원본 코드에서 변수 선언이 '…'(작은따옴표)였기에 큰따옴표는 그대로 문자열 안에 포함된다. 만약 큰따옴표로 감쌌다면 \"식으로 미리 이스케이프해 적어야 했다.

 

반응형

 

4 단계별 추적
1
$string에 작은따옴표로 감싼 문자열 저장안의 큰따옴표는 그대로 문자 — 8개 포함
2
addslashes($string) 호출함수가 문자열을 한 글자씩 검사
3
" 만남 → \" 로 변환각 큰따옴표 앞에 백슬래시 삽입
4
새 문자열 반환총 8개의 \가 추가됨
5
$result에 받아서 print화면에 \"…\" 형태로 표시됨

5 옛날엔 왜 썼는가? — magic_quotes

PHP 4 시절에는 폼 입력값이 자동으로 addslashes로 처리되는 magic_quotes_gpc 옵션이 있었다. SQL 인젝션을 막아준다고 광고됐지만 결과적으로 문제가 더 많았다.

※ magic_quotes의 역사
  • PHP 4: 기본 켜짐 — 모든 입력값에 자동 addslashes
  • PHP 5.3: 비추천(deprecated) 표시
  • PHP 5.4: 완전히 제거
  • 지금은 자동 처리 없음 → 필요한 곳에서만 명시적으로

6 현대 PHP에선 거의 안 쓴다
addslashes()SQL 보안용으로는 부적합하다. 다중 바이트 문자(UTF-8 한글 등)에서 우회될 수 있고, 따옴표 외 다른 SQL 메타문자는 처리하지 못한다.
용도 옛 방법 현대 방법
SQL 쿼리 안전 처리 addslashes Prepared Statement (PDO·mysqli)
HTML 출력 안전 처리 addslashes htmlspecialchars()
JS에 데이터 넘기기 addslashes json_encode()
URL 인코딩 addslashes urlencode() / rawurlencode()

7 stripslashes() — 반대 함수

addslashes로 추가된 백슬래시를 제거하려면 stripslashes를 쓴다.

$a = '"hello"'; $b = addslashes($a); // \"hello\" $c = stripslashes($b); // "hello" (원래대로)

8 자주 하는 실수
실수 증상 해결
SQL 안전용으로 addslashes 사용 UTF-8 인젝션 우회 가능 PDO/mysqli prepared statement 사용
HTML 출력에 addslashes XSS 차단 안 됨 (<는 그대로) htmlspecialchars()
이미 처리된 문자열에 또 적용 \\\\ 처럼 백슬래시 두 배 처리 시점을 명확히, 한 번만
출력값을 DB에 그대로 저장 \가 데이터에 들어감 입력 단계에서 처리 X, 출력 단계 X, 저장 단계 X — 적절한 위치에서 한 번만
"백슬래시가 ₩로 보인다"라 오해 같은 문자, 글꼴 차이일 뿐 코드값 0x5C 동일

9 권장 — Prepared Statement (PDO)
// 옛 방식 (addslashes) — 위험 $name = addslashes($_POST['name']); mysql_query("SELECT * FROM users WHERE name = '$name'"); // 현대 방식 (PDO + prepared) — 안전 $stmt = $pdo->prepare('SELECT * FROM users WHERE name = ?'); $stmt->execute([$_POST['name']]); $row = $stmt->fetch();

prepared statement는 SQL 문장 구조와 데이터를 완전히 분리해 처리하므로 인젝션이 원리적으로 불가능하다.


핵심 한 줄 요약

addslashes()' " \ \0 앞에 백슬래시를 자동으로 추가
목적문자열 안의 따옴표를 일반 문자로 보호
결과"사과" → \"사과\"
백슬래시 ≠ ₩한국 글꼴에서 ₩로 보일 뿐 같은 기호
stripslashes()반대 함수 — 백슬래시 제거
SQL 부적합UTF-8 환경에서 인젝션 우회 가능
현대 권장PDO/mysqli prepared statement, htmlspecialchars 등
반응형

댓글