
고급 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>
→<script>
로 바뀌어서 브라우저가 실행하지 않아요!
🔐 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(사이트 간 요청 위조) 방지에 대해 이어서 알려드릴게요!
오늘도 안전한 코딩 되세요~ 💻🛡️🚀