본문 바로가기
보안이슈

XSS 취약점을 방어하기 위해 콘텐츠 보안 정책(CSP) 적용

by 씨엔아이소프트 2024. 9. 27.
반응형

XSS 취약점을 방어하기 위해 다음과 같은 조치를 취할 수 있습니다:

ㅇ 입력값 필터링 및 인코딩: 모든 사용자 입력값을 적절히 필터링하고, HTML, JavaScript, URL 등의 콘텐츠로 렌더링될 때 특수 문자를 인코딩합니다.

ㅇ 콘텐츠 보안 정책(CSP) 적용: CSP를 적용하여 스크립트 소스와 같은 콘텐츠를 제한하여 악성 스크립트의 실행을 방지합니다.

ㅇ 프레임워크 보안 기능 활용: 최신 웹 프레임워크의 보안 기능을 적극 활용하여 기본적인 XSS 방어를 강화합니다.


1. 콘텐츠 보안 정책(CSP) 설정

현재 설정된 도메인:

https://ajax.googleapis.com (jQuery 및 jQuery UI 로드)
https://eai.jbnu.ac.kr (자체 서버의 모든 리소스)
https://apis.google.com (Google API)
https://cdn.jsdelivr.net (외부 CDN)
https://maxcdn.bootstrapcdn.com (FontAwesome 및 Bootstrap)
https://fonts.googleapis.com (Google Fonts)
https://fonts.gstatic.com (Google Fonts 관련)

2. 추가 도메인
헤더에 나열된 다른 외부 리소스는 다음과 같습니다:

http://cdn.jsdelivr.net/npm/xeicon@2.3.3/xeicon.min.css
이 경로는 http:// 프로토콜을 사용하고 있습니다. 만약 CSP에 https://cdn.jsdelivr.net을 허용했으므로, CSP 설정에 추가할 필요는 없지만, 보안상의 이유로 https://로 수정하는 것이 좋습니다.
//ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/ui-lightness/jquery-ui.css
이 경로는 프로토콜을 지정하지 않았으므로, 브라우저가 http:// 또는 https://를 자동으로 선택합니다. 현재 CSP 설정에 https://ajax.googleapis.com이 포함되어 있으므로 추가 작업은 필요하지 않습니다.
3. CSP 업데이트
따라서 CSP 설정에 추가로 도메인을 넣을 필요는 없지만, 아래와 같이 약간의 최적화가 가능합니다.


<?php
$nonce = base64_encode(random_bytes(16));
?>
<meta http-equiv="Content-Security-Policy" content="default-src 'self';
    script-src 'self' 'nonce-<?php echo $nonce; ?>' https://ajax.googleapis.com https://www.myhompage.kr https://apis.google.com;
    style-src 'self' https://www.myhompage.kr https://cdn.jsdelivr.net https://maxcdn.bootstrapcdn.com https://fonts.googleapis.com https://ajax.googleapis.com;
    font-src 'self' https://fonts.gstatic.com https://maxcdn.bootstrapcdn.com;
    img-src 'self' data: https://www.myhompage.kr;
    frame-src 'self';
    connect-src 'self' https://www.myhompage.kr;
    object-src 'none';
    report-uri /csp-report;">
반응형

댓글