Stored XSS

저장형 XSS

설명

데이터베이스 등 영구 저장소에서 읽은 값을 인코딩 없이 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 값에는 각 출력 컨텍스트에 맞는 보호를 적용합니다.

참조