반응형
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 등
반응형
'php' 카테고리의 다른 글
| PHP implode — 배열을 구분자로 합쳐 문자열로 변환 완전 정리 (0) | 2026.06.14 |
|---|---|
| PHP explode — 문자열을 구분자로 잘라 배열로 변환 완전 정리 (0) | 2026.06.14 |
| PHP static 변수 — 호출 사이에 값을 기억시키는 누적 카운터 완전 정리 (0) | 2026.06.14 |
| PHP 지역 변수 — static 없을 때의 함정 완전 정리 (0) | 2026.06.14 |
| PHP $GLOBALS 슈퍼글로벌 배열 — 전역 변수 직접 접근 완전 정리 (0) | 2026.06.14 |
왕진 블로그

댓글