Content Security Policy(CSP; 콘텐츠보안정책)의 구조
개발자 콘솔에서 다음과 같은 오류가 많이 발생합니다.
문자열 평가를 거부했습니다.
다음 컨텐츠 보안 정책 지시문에 위반되므로 인라인 스크립트 실행을 거부했습니다.
스크립트 로드를 거부했습니다.
스타일시트 로드를 거부했습니다.
게게다다다다다???Content Security Policy(CSP; CSP; 「」의 사용 Content-Security-Policy
HTTP 더??
구체적으로 어떻게...
- ...여러 소스를 허용합니까?
- ...다른 지시를 사용합니까?
- ...여러 디렉티브를 사용합니까?
- ...포트를 사용하시겠습니까?
- 다른 프로토콜이 필요합니까?
- ...락하하
file://
★★★★★★★★★★★★★★★★★★? - 스타일,및 ...「 」, 「 」, 「 」
<style>
★★★★★★★★★★★★★★★★★」<script>
- ...락하하
eval()
그리고 마지막으로:
- 정확히 어떤 일입니까?
'self'
Content-Security-Policy
meta-tag를 사용하면 리소스를 로드할 수 있는 위치를 정의할 수 있으므로 브라우저가 다른 위치에서 데이터를 로드할 수 없으므로 XSS 공격의 위험을 줄일 수 있습니다.이로 인해 공격자가 악성 코드를 사이트에 주입하는 것이 더 어려워집니다.
CSP 에러가 발생하는 이유를 알기 위해 벽돌 벽에 머리를 부딪혔지만, 그 구조에 대한 간결하고 명확한 지시는 없었던 것 같습니다.CSP의 몇 가지 포인트에 대해 간단하게 설명하겠습니다.대부분 해결이 어렵다고 생각되는 것에 초점을 맞추고 있습니다.
간략하게 하기 위해 각 샘플에 풀태그를 기재하지 않겠습니다. ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★content
즉 property서 음 、 음음 、 음 that 、 용 that 、 property property property property property property property property property property 。content="default-src 'self'"
츠키다
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">
1. 여러 소스를 허용하려면 어떻게 해야 합니까?
지시문 뒤에 공백으로 구분된 목록으로 소스를 나열할 수 있습니다.
content="default-src 'self' https://example.com/js/"
특별한 파라미터 이외의 파라미터 주변에는 따옴표가 없습니다.'self'
결장도 :
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★지시문만 입력한 다음 공백으로 구분된 매개 변수 목록입니다.
지정된 파라미터보다 작은 것은 모두 암묵적으로 허용됩니다.즉, 위의 예에서는 이것들이 유효한 소스가 됩니다.
https://example.com/js/file.js
https://example.com/js/subdir/anotherfile.js
단, 이는 유효하지 않습니다.
http://example.com/js/file.js
^^^^ wrong protocol
https://example.com/file.js
^^ above the specified path
2. 다른 지시어를 사용하는 방법은 무엇입니까?그들은 각각 무엇을 하나요?
가장 일반적인 지시사항은 다음과 같습니다.
default-src
요청 등을 , " ", CSS, ", AJAX"script-src
는 javascript files javascript의 합니다.style-src
css 파일의 유효한 소스를 정의합니다.img-src
이미지의 유효한 소스를 정의합니다.connect-src
는 XMLHttpRequest(AJAX), WebSockets 또는 EventSource 에 대한 유효한 대상을 정의합니다.여기서 허용되지 않는 호스트에 대한 접속을 시도하면 브라우저는 다음 명령을 에뮬레이트합니다.400
에러
다른 것도 있지만, 이것이 당신에게 가장 필요한 것입니다.
3. 여러 디렉티브를 사용하려면 어떻게 해야 합니다.
1개의 메타데이터 태그내의 모든 디렉티브를 세미콜론으로 끝내는 것으로 정의합니다( ).;
):
content="default-src 'self' https://example.com/js/; style-src 'self'"
4. 포트를 어떻게 처리합니까?
기본 포트를 제외한 모든 것을 허용 도메인 뒤에 포트 번호 또는 아스타리스크를 추가하여 명시적으로 허용해야 합니다.
content="default-src 'self' https://ajax.googleapis.com http://example.com:123/free/stuff/"
위의 결과는 다음과 같습니다.
https://ajax.googleapis.com:123
^^^^ Not ok, wrong port
https://ajax.googleapis.com - OK
http://example.com/free/stuff/file.js
^^ Not ok, only the port 123 is allowed
http://example.com:123/free/stuff/file.js - OK
전술한 바와 같이 아스타리스크를 사용하여 모든 포트를 명시적으로 허용할 수도 있습니다.
content="default-src example.com:*"
5. 다양한 프로토콜을 어떻게 처리할 수 있습니까?
기본적으로 표준 프로토콜만 허용됩니다.예를 들어 WebSockets를 허용하려면ws://
명시적으로 허가할 필요가 있습니다.
content="default-src 'self'; connect-src ws:; style-src 'self'"
^^^ web Sockets are now allowed on all domains and ports.
6. 파일 프로토콜을 허용하려면 어떻게 해야 합니까?file://
?
그렇게 정의하려고 하면 효과가 없어요.대신, 이 기능을filesystem
파라미터:
content="default-src filesystem"
7. 인라인 스크립트 및 스타일 정의를 사용하려면 어떻게 해야 합니까?
명시적으로 허용되지 않는 한 인라인 스타일 정의, 내부 코드를 사용할 수 없습니다.<script>
태그 또는 다음과 같은 태그 속성에서onclick
다음과 같이 허용합니다.
content="script-src 'unsafe-inline'; style-src 'unsafe-inline'"
또한 인라인 base64 인코딩 이미지를 명시적으로 허용해야 합니다.
content="img-src data:"
8. 어떻게 하면eval()
?
'평가는 사악하다' 그리고 임박한 세상의 종말의 가장 유력한 원인이기 때문에 많은 사람들은 그렇지 않다고 말할 것이다.그 사람들은 틀릴 거야.물론 eval을 통해 사이트의 보안에 큰 구멍을 뚫을 수 있지만 사용 사례는 완벽하게 유효합니다.현명하게 사용하시면 됩니다.다음과 같이 허용합니다.
content="script-src 'unsafe-eval'"
9. 정확히 어떤 일을 하는가?'self'
심술궂은가요?
가져가도 좋다'self'
로컬 호스트, 로컬 파일 시스템 또는 동일한 호스트에 있는 모든 것을 의미합니다.그건 그 어떤 것도 의미하지 않아요.즉, 콘텐츠 정책이 정의된 파일과 동일한 체계(프로토콜), 호스트 및 포트를 가진 소스를 의미합니다.HTTP를 통해 사이트를 서비스하시겠습니까?명시적으로 정의하지 않는 한 https는 사용할 수 없습니다.
가 쓴 적이 있어요.'self'
대부분의 예에서는 포함시키는 것이 이치에 맞지만, 강제적인 것은 아닙니다.요요필
하지만 잠깐만!그냥 쓰면 안 돼요?content="default-src *"
★★★★★★★★★★★★★★★★?
아닙니다. 명백한 보안 취약점 외에도 이 또한 예상대로 작동하지 않습니다.비록 어떤 의사들은 그것이 무엇이든 허용한다고 주장하지만, 그것은 사실이 아니다.인라인이나 eval을 사용할 수 없기 때문에 사이트를 더욱 취약하게 만들려면 다음과 같이 하십시오.
content="default-src * 'unsafe-inline' 'unsafe-eval'"
하지만 안 그럴 거라 믿어요
추가 정보:
http://content-security-policy.com
http://en.wikipedia.org/wiki/Content_Security_Policy
Apache 2 mod_headers
Apache 2 mod_headers를 활성화할 수도 있습니다.Fedora 에서는, 디폴트로 이미 유효하게 되어 있습니다.Ubuntu/Debian을 사용하는 경우 다음과 같이 활성화합니다.
# First enable headers module for Apache 2,
# and then restart the Apache2 service
a2enmod headers
apache2 -k graceful
에서는 Ubuntu/Debian 파일의 할 수 ./etc/apache2/conf-enabled/security.conf
#
# Setting this header will prevent MSIE from interpreting files as something
# else than declared by the content type in the HTTP headers.
# Requires mod_headers to be enabled.
#
#Header set X-Content-Type-Options: "nosniff"
#
# Setting this header will prevent other sites from embedding pages from this
# site as frames. This defends against clickjacking attacks.
# Requires mod_headers to be enabled.
#
Header always set X-Frame-Options: "sameorigin"
Header always set X-Content-Type-Options nosniff
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Permitted-Cross-Domain-Policies "master-only"
Header always set Cache-Control "no-cache, no-store, must-revalidate"
Header always set Pragma "no-cache"
Header always set Expires "-1"
Header always set Content-Security-Policy: "default-src 'none';"
Header always set Content-Security-Policy: "script-src 'self' www.google-analytics.com adserver.example.com www.example.com;"
Header always set Content-Security-Policy: "style-src 'self' www.example.com;"
주의: 이것은 파일의 맨 아래 부분입니다.마지막 3개의 엔트리만이 CSP 설정입니다.
첫 번째 파라미터는 지시어, 두 번째 파라미터는 화이트리스트에 포함될 소스입니다.구글 분석과 애드서버를 추가했습니다.또한 Apache 2에 www.example.com 및 example.com 등의 에일리어스가 설정되어 있는 경우 화이트리스트에도 추가해야 합니다.
인라인 코드는 유해하다고 간주되므로 피해야 합니다.모든 JavaScript 코드와 CSS를 개별 파일에 복사하여 화이트리스트에 추가합니다.
그 사이에 다른 헤더 설정을 확인하고 mod_security를 설치할 수 있습니다.
추가 정보:
https://developers.google.com/web/fundamentals/security/csp/
언급URL : https://stackoverflow.com/questions/30280370/how-does-content-security-policy-csp-work
'sourcecode' 카테고리의 다른 글
PDO 사용 여부/필수:null 값을 바인딩할 때 PARAM_NULL? (0) | 2022.11.16 |
---|---|
jQuery를 사용한 addClass/removeClass 애니메이션 생성 (0) | 2022.11.16 |
모키토 모조 오브젝트가 다음에 호출되었을 때 다른 것을 반환하도록 지시하려면 어떻게 해야 합니까? (0) | 2022.11.16 |
IntelliJ Idea 프로젝트 트리에서 컴파일 오류를 즉시 확인하는 방법 (0) | 2022.11.16 |
WebSphere MQ 또는 Tibco Rendezvous와 같은 메시징 솔루션 대신 액터를 사용해야 하는 경우 (0) | 2022.11.16 |