설명
데이터베이스 등 영구 저장소에서 읽은 값을 인코딩 없이 HTML로 출력하면 Stored XSS가 발생할 수 있습니다.
잠재적 영향
취약 페이지를 보는 모든 사용자에게 악성 스크립트가 실행될 수 있습니다.
해결 방법
저장 전 검증과 별개로 출력 시점에도 인코딩합니다. HTML 텍스트와 따옴표로 감싼 일반 속성값에는 htmlspecialchars를 사용하고, JavaScript, CSS, URL 값에는 각 출력 컨텍스트에 맞는 보호를 적용합니다.
예시
변경 전
php
<?php
$row = mysqli_fetch_row($result);
$guestbook .= "<div>Name: {$row[0]}</div>";
변경 후
php
<?php
$row = mysqli_fetch_row($result);
$name = htmlspecialchars($row[0], ENT_QUOTES, 'UTF-8');
$guestbook .= "<div>Name: {$name}</div>";
설명:
- 변경 전: 영구 저장소에서 읽은 데이터가 출력 인코딩 없이 HTML 응답에 기록됩니다.
- 변경 후: 저장 전 검증과 별개로 출력 시점에도 인코딩합니다. HTML 텍스트와 따옴표로 감싼 일반 속성값에는
htmlspecialchars를 사용하고, JavaScript, CSS, URL 값에는 각 출력 컨텍스트에 맞는 보호를 적용합니다.