고급 PHP 프로그래밍 – 웹 보안 – 1 – 크로스 사이트 스크립팅(XSS) 방지

고급 PHP 프로그래밍 - 웹 보안 - 1 - 크로스 사이트 스크립팅(XSS) 방지
고급 PHP 프로그래밍 – 웹 보안 – 1 – 크로스 사이트 스크립팅(XSS) 방지

고급 PHP 프로그래밍 – 웹 보안 – 크로스 사이트 스크립팅(XSS) 방지

안녕하세요~ 😊
오늘은 웹 보안에서 빼놓을 수 없는 두 번째 핵심 주제, 바로 **크로스 사이트 스크립팅(XSS)**에 대해 알아보겠습니다!
XSS는 마치 웹 페이지 속에 숨어든 파리처럼 눈치채기 어렵고, 방치하면 심각한 피해를 줄 수 있는 위험한 공격이에요.

하지만 걱정 마세요! 🛡️
이번 글에서는 XSS가 뭔지부터 시작해서, PHP에서 안전하게 방어하는 법까지
비유와 예제를 통해 쏙쏙 쉽게 알려드릴게요!


XSS(크로스 사이트 스크립팅)란 무엇인가요?

XSS는 공격자가 웹 페이지에 악성 스크립트를 삽입하여
해당 페이지를 보는 사용자에게 비정상적인 자바스크립트를 실행시키는 공격입니다.

쉽게 말해, 누군가 방명록에 몰래 폭죽(스크립트)을 숨겨 놓고,
방문자가 글을 볼 때 그 폭죽이 펑! 터지면서 브라우저를 공격하는 거예요 😨


예제: XSS가 실제로 발생하는 상황

💥 취약한 코드

$comment = $_GET['comment'];
echo "사용자 의견: $comment";

💣 공격자 입력

<xss-script>alert('해킹 성공!');</xss-script>

😱 출력 결과

사용자 의견: <xss-script>alert('해킹 성공!');</xss-script>

사용자가 글을 읽기만 해도 alert이 뜨고, 쿠키 탈취나 피싱 페이지로 리디렉션까지 가능해져요!


XSS의 종류

유형 설명
반사형(Reflected XSS) URL 파라미터를 통해 바로 실행됨
저장형(Stored XSS) DB에 저장되어 페이지 로딩 시마다 실행됨
DOM 기반 XSS JavaScript에서 DOM 조작 시 발생

XSS의 위험성

  • ✅ 세션 쿠키 탈취
  • ✅ 로그인 정보 탈취
  • ✅ 관리자 페이지 접근
  • ✅ 악성 링크로 유도
  • ✅ 키보드 입력 가로채기 (Keylogger)

한 줄의 스크립트가 웹사이트의 신뢰도를 무너뜨릴 수 있어요! 🧨


XSS 방지 방법

🔐 1. htmlspecialchars() 사용

가장 기본적이고 강력한 방법이에요!
HTML 태그로 해석될 수 있는 특수 문자를 무해한 문자열로 변환해줍니다.

$comment = $_GET['comment'];
$safe_comment = htmlspecialchars($comment, ENT_QUOTES, 'UTF-8');
echo "사용자 의견: $safe_comment";

<xss-script>&lt;script&gt;로 바뀌어서 브라우저가 실행하지 않아요!


🔐 2. strip_tags()로 태그 제거

HTML 자체가 필요 없을 땐 아예 태그를 제거해버릴 수 있어요.

echo strip_tags($_GET['comment']);

단, 사용자에게 줄바꿈이나 강조 등 일부 태그를 허용하고 싶다면 strip_tags($str, '<b><br>')처럼 예외를 지정할 수 있어요.


🔐 3. Content Security Policy(CSP) 설정

서버에서 CSP 헤더를 설정하면, 외부 스크립트나 인라인 스크립트의 실행을 차단할 수 있어요.

header("Content-Security-Policy: default-src 'self'");

사용자가 악성 <xss-script src="http://evil.com/xss.js">를 넣어도 실행이 차단돼요!


🔐 4. 입력과 출력의 책임 구분

✔️ 입력 시 필터링보단, 출력 시 escaping 하자!

  • 사용자가 입력한 데이터는 원본 그대로 DB에 저장
  • 웹 페이지에 표시할 때만 htmlspecialchars()로 escape 처리
// 저장 시
$content = $_POST['content'];
// DB에 그대로 저장

// 출력 시
echo htmlspecialchars($content, ENT_QUOTES, 'UTF-8');

🔐 5. JavaScript 안에서도 Escape 처리 주의!

<xss-script>
    const nickname = "<?= htmlspecialchars($nickname, ENT_QUOTES, 'UTF-8') ?>";
</xss-script>

<xss-script> 내에서도 XSS 위험이 있어요!
쿼터(따옴표) 이스케이프는 필수랍니다.


실전 예제: 게시판 글 출력 시 안전하게

<?php
foreach ($posts as $post) {
    echo "<h2>" . htmlspecialchars($post['title']) . "</h2>";
    echo "<p>" . nl2br(htmlspecialchars($post['content'])) . "</p>";
}
?>

nl2br()로 줄바꿈 유지하면서, htmlspecialchars()로 태그 방어까지! 완벽한 조합이에요 😊


보안 강화 추가 팁 ✅

항목 설명
HTTPS 사용 세션 가로채기 위험 방지
세션 쿠키에 HttpOnly 설정 JS에서 접근 불가능하게 막기
관리자 권한 관리 철저 댓글, 게시글 등에 필터 강화
JS 프레임워크 사용 시 주의 v-html, dangerouslySetInnerHTML 등은 XSS의 지뢰밭입니다

요약 정리 🎯

방법 설명
htmlspecialchars() 가장 기본적이고 강력한 XSS 방지법
strip_tags() HTML 태그 자체를 제거
CSP 브라우저에서 실행 자체를 차단
JS 출력 시 이스케이프 <xss-script> 내 출력 시 반드시 처리
출력 시 escape 저장보다 출력에 신경쓰기

마무리하며 😊

XSS는 겉보기엔 무해해 보이는 댓글 한 줄, 입력 한 칸으로도
웹사이트 전체의 보안을 무너뜨릴 수 있는 위험한 공격이에요.
하지만 오늘 알려드린 기법들을 잘 숙지하고 사용한다면
충분히 막아낼 수 있는 방어력도 갖출 수 있답니다!

“입력값은 언제나 의심하고, 출력값은 꼭 필터링하자!”
이 원칙만 기억해도 여러분은 이미 보안의 고수에 한 걸음 가까워진 거예요 😊

다음 시간에는 CSRF(사이트 간 요청 위조) 방지에 대해 이어서 알려드릴게요!
오늘도 안전한 코딩 되세요~ 💻🛡️🚀

답글 남기기