사용자 입력값 정제
htmlspecialchars와 filter_input으로 위험한 문자를 제거합니다.
사용자 입력값 정제은(는) CoddyKit의 무료 PHP Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 PHP Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
정제와 유효성 검사의 차이
유효성 검사는 데이터가 요구 사항을 충족하는지 확인하고, 충족하지 않으면 거부합니다.
정제는 위험한 문자를 제거하거나 인코딩하여 데이터를 안전하게 사용할 수 있도록 정리합니다.
둘 다 필요합니다 — 먼저 유효성 검사를 한 다음 출력용으로 정제합니다.
HTML 출력을 위한 htmlspecialchars()
XSS를 방지하려면 HTML에 삽입하기 전에 항상 출력을 이스케이프합니다:
<?php
$name = '<script>alert(1)</script>';
// Dangerous — executes script:
// echo $name;
// Safe:
echo htmlspecialchars($name, ENT_QUOTES | ENT_HTML5, 'UTF-8');
// <script>alert(1)</script>htmlentities()와 htmlspecialchars() 비교
둘 다 HTML을 이스케이프하지만, htmlentities는 적용 가능한 모든 문자를 변환하고 htmlspecialchars는 가장 위험한 다섯 문자만 변환합니다:
<?php
$str = '<b>café</b> & "bar"';
// htmlspecialchars: only & < > ' "
echo htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
// htmlentities: also converts é → é
echo htmlentities($str, ENT_QUOTES, 'UTF-8');
// Prefer htmlspecialchars — htmlentities can break UTF-8filter_var FILTER_SANITIZE_*
filter_var 정제 모드는 위험한 콘텐츠를 제거합니다:
<?php
$rawEmail = 'user(bad)@exam<ple.com';
$clean = filter_var($rawEmail, FILTER_SANITIZE_EMAIL);
echo $clean; // user@example.com
$rawUrl = 'http://exa mple.com/pa th?q=foo bar';
$cleanUrl = filter_var($rawUrl, FILTER_SANITIZE_URL);
echo $cleanUrl;strip_tags()
문자열에서 HTML 태그를 제거하며, 선택적으로 허용된 태그는 유지할 수 있습니다:
<?php
$input = '<p>Hello <b>World</b> <script>alert(1)</script></p>';
// Remove all tags:
echo strip_tags($input);
// Hello World alert(1)
// Keep only <b> and <i>:
echo strip_tags($input, '<b><i>');
// Hello <b>World</b>SQL을 위한 정제
문자열 함수로 SQL을 정제하려고 하지 말고 항상 준비된 문을 사용합니다. 올바른 방법은 다음과 같습니다:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
// WRONG — even with addslashes this is dangerous:
// $sql = "SELECT * FROM users WHERE email = '" . addslashes($email) . "'";
// CORRECT — prepared statement:
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$user = $stmt->fetch();addslashes()와 준비된 문 비교
addslashes()는 백슬래시와 따옴표를 이스케이프하지만 SQL에는 안전하지 않습니다. 대신 PDO 준비된 문을 사용합니다. addslashes()는 JavaScript 문자열 생성과 같은 SQL 이외의 용도에는 여전히 유용할 수 있습니다:
<?php
// For embedding PHP string into JavaScript (still escape via json_encode):
$jsData = json_encode(['name' => $userInput], JSON_HEX_QUOT);
echo "<script>var data = $jsData;</script>";파일 이름 정제
업로드된 파일 이름에서 위험한 문자를 제거합니다:
<?php
function sanitizeFilename(string $name): string {
// Remove path traversal chars and other dangerous ones
$name = basename($name); // strip any path
$name = preg_replace('/[^a-zA-Z0-9._-]/', '_', $name); // only safe chars
$name = preg_replace('/_{2,}/', '_', $name); // collapse underscores
return strtolower($name);
}
echo sanitizeFilename('../../../etc/passwd'); // etc_passwd
echo sanitizeFilename('My Photo (1).JPG'); // my_photo_1_.jpg식별자를 위한 정수 캐스팅
숫자 식별자를 정제하는 가장 간단한 방법은 정수로 캐스팅하는 것입니다. 이렇게 하면 숫자가 아닌 콘텐츠가 삭제됩니다:
<?php
// Never do this:
$id = $_GET['id'];
$sql = "SELECT * FROM posts WHERE id = $id";
// Safe approach 1: cast to int
$id = (int) ($_GET['id'] ?? 0);
if ($id <= 0) die('Invalid ID');
// Safe approach 2: validate
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
if (!$id) die('Invalid ID');출력 문맥이 중요합니다
출력 문맥에 따라 서로 다른 이스케이프가 필요합니다:
- HTML 본문 →
htmlspecialchars() - HTML 속성 →
htmlspecialchars(ENT_QUOTES) - JSON/JavaScript →
json_encode() - URL 매개변수 →
urlencode() - SQL → 준비된 문
urlencode 및 rawurlencode
URL에서 사용할 값을 인코딩합니다:
<?php
$search = 'hello world & PHP';
echo urlencode($search);
// hello+world+%26+PHP (+ for spaces)
echo rawurlencode($search);
// hello%20world%20%26%20PHP (RFC 3986 — use in paths)
$url = 'https://example.com/search?q=' . urlencode($search);
echo $url;빠른 확인
데이터베이스 질의에서 사용자 입력을 사용할 때 SQL 삽입을 방지하는 올바른 함수는 무엇인가요?
복습: 입력 정제
정제 규칙:
- HTML 출력 →
htmlspecialchars(ENT_QUOTES, 'UTF-8') - SQL → 준비된 문, 문자열 이스케이프는 사용하지 않습니다
- URL →
urlencode()또는rawurlencode() - 파일 이름 → 정규 표현식으로 제거하고
basename()을 사용합니다 - 정수 식별자 →
(int)로 캐스팅합니다 - 태그 → 허용된 태그 필터링에
strip_tags()를 사용합니다
자주 묻는 질문
“사용자 입력값 정제” 강의는 무료인가요?
네 — “사용자 입력값 정제” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 PHP Academy 강의 전체를 잠금 해제할 수 있습니다. PHP Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“사용자 입력값 정제”에서 뭘 배우나요?
htmlspecialchars와 filter_input으로 위험한 문자를 제거합니다. 브라우저에서 직접 실행하는 실습 코드로 PHP Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
PHP Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 PHP Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“사용자 입력값 정제” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 PHP Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 PHP Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.