다음 콘텐츠 보안 정책 지침을 위반하여 스크립트로드를 거부했습니다.


104

5.0.0 ( Lollipop ) 이상의 Android 시스템이있는 기기에 앱을 배포하려고 할 때 다음과 같은 오류 메시지가 계속 표시됩니다.

07-03 18 : 39 : 21.621 : D / SystemWebChromeClient (9132) : file : ///android_asset/www/index.html : 0 행 : 다음 콘텐츠를 위반하여 'http : // xxxxx'스크립트로드 거부 보안 정책 지시문 : "script-src 'self' 'unsafe-eval' 'unsafe-inline'". 07-03 18 : 39 : 21.621 : I / chromium (9132) : [INFO : CONSOLE (0)] "다음 콘텐츠 보안 정책 지침을 위반했기 때문에 'http : // xxx'스크립트로드 거부 :"script- src 'self' 'unsafe-eval' 'unsafe-inline' "입니다.

그러나 Android 시스템 4.4.x ( KitKat )가 설치된 모바일 장치에 배포 한 경우 보안 정책은 기본 정책으로 작동합니다.

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">

그런 다음 다음과 같이 변경해야한다고 생각했습니다.

<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'; style-src 'self' 'unsafe-inline'; media-src *">

기본적으로 두 가지 옵션이 모두 작동하지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?


내 문제와 매우 유사합니다. "다음 콘텐츠 보안 정책 지침을 위반했기 때문에 JSON 파일을 검색 할 수 없습니다 :"connect-src 'self' ""
Michael R

1
@MichaelR tampermonkey addon 또는 다른 모든 것과 같은 JS를 통해 API에서 일부 JSON 정보를 검색하려면이 플러그인 chrome.google.com/webstore/detail/disable-content-security/… 를 사용하고 원하는 동안 CSP 확인을 비활성화 할 수 있습니다. 어떤 것. 완전히 안전하지는 않지만 어떤 경우에는 작동 할 수 있습니다. 내 오류를 찾고 있었기 때문에 여기 에이 답변을 게시하고 있으며이 주제는 Google에서 먼저 표시됩니다.
Eryk Wróbel

답변:


68

아래의 메타 태그를 다음으로 바꾸십시오.

<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' http://* 'unsafe-inline'; script-src 'self' http://* 'unsafe-inline' 'unsafe-eval'" />

또는 당신이 무엇을뿐만 아니라, 당신은 추가해야 http://*모두 style-srcscript-src위에서 본 '자기'이후에 추가한다.

서버에 Content-Security-Policy헤더 가 포함되어 있으면 헤더가 메타보다 우선합니다.


6
여기서 정의한 CSP를 이해하면 공격을 방지하기 위해 모든 종류의 보안을 비활성화 하고 스크립트 태그를 허용하고 모든 도메인 및 비보안 연결을 통해 스크립트를로드합니다. developers.google.com/web/fundamentals/security/csp를 참조하세요. 아니면 s.th를받을 수 있나요? 잘못된? 나는 대부분의 경우 (개발 및 디버깅 제외) 이것이 당신이 원하는 것이 아니라고 생각합니다 ... 맞습니까?
Peter T.


9
나는 CSP를 사용할 때``unsafe-inline '' 'unsafe-eval'을 사용하도록 제안하기 때문에이 답변을 반대 투표합니다!
HerTesla

39

MagngooSasa에 의해 주어진 자기의 대답은 트릭을했지만 다른 사람이 대답을 이해하려고 노력을 위해, 여기에 몇 가지 좀 더 자세한 사항은 다음과 같습니다 :

Visual Studio로 Cordova 앱을 개발할 때 원격 JavaScript 파일 (http://Guess.What.com/MyScript.js에 있음)을 가져 오려고했지만 제목에 오류가 있습니다.

다음은 프로젝트의 index.html 파일에서 앞에 있는 메타 태그입니다 .

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">

다음은 원격 스크립트를 가져올 수 있도록 수정 된 메타 태그입니다.

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *;**script-src 'self' http://onlineerp.solution.quebec 'unsafe-inline' 'unsafe-eval';** ">

그리고 더 이상 오류가 없습니다!


15

다음과 같이 해결되었습니다.

script-src 'self' http://xxxx 'unsafe-inline' 'unsafe-eval';

46
좀 더 설명해 주 시겠어요? 전체 메타를 붙여 넣을 수 있습니까?
Tony


2
이렇게하면 악성 플러그인 / xss가 인라인 및 평가 스크립트를 삽입 할 수 있도록 허용하여 스크립트에 대한 CSP를 효과적으로 비활성화하여 CSP를 활성화하는 전체 목적을 무력화합니다.
IncredibleHat

7

우리는 이것을 사용했습니다.

<meta http-equiv="Content-Security-Policy" content="default-src gap://ready file://* *; style-src 'self' http://* https://* 'unsafe-inline'; script-src 'self' http://* https://* 'unsafe-inline' 'unsafe-eval'">

7

완전한 설명을 원하는 사람이라면 콘텐츠 보안 정책 ( https://www.html5rocks.com/en/tutorials/security/content-security-policy/)을 살펴 보시기 바랍니다 .

에서 "코드 https://mybank.com은 단지에 액세스 할 수 있어야한다 https://mybank.com 의 데이터를, 그리고 https://evil.example.com 확실히 액세스를 허용해서는 안됩니다. 각각의 기원이 분리 유지 나머지 웹 "

XSS 공격은 브라우저가 다른 웹 사이트에서 다운로드 한 코드와 앱의 코드를 구별 할 수 없기 때문에 발생합니다. 따라서 Content-Security-PolicyHTTP 헤더를 사용하여 콘텐츠를 안전하게 다운로드 할 수있는 콘텐츠 원본을 화이트리스트에 추가해야합니다 .

이 정책은 일련의 정책 지시문을 사용하여 설명되며, 각 지시문은 특정 리소스 유형 또는 정책 영역에 대한 정책을 설명합니다. 정책에는 자체 정책이 없을 때 다른 리소스 유형에 대한 대비책 인 default-src 정책 지시문이 포함되어야합니다.

따라서 태그를 다음과 같이 수정하면

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *;**script-src 'self' http://onlineerp.solution.quebec 'unsafe-inline' 'unsafe-eval';** ">

당신은 Javacsript 코드 (실행 권한을 부여하는 것을 말하는 script-src기원에서)를 'self', http://onlineerp.solution.quebec, 'unsafe-inline', 'unsafe-eval'.

처음 두 가지는 귀하의 사용 사례에 대해 완전히 유효하다고 생각하지만 다른 사례에 대해서는 약간 확신이 없습니다. 'unsafe-line'그리고 'unsafe-eval'당신이 그들에 대한 매우 구체적인 필요가 없다면 당신이 그들을 사용하지 않아야하므로 보안 문제가 포즈 :

"eval 및 text-to-JavaScript 형제가 응용 프로그램에 완전히 필수적인 경우 script-src 지시문에 허용 된 소스로 'unsafe-eval'을 추가하여 활성화 할 수 있습니다. 그러나 다시 말하지 마십시오. 문자열을 실행할 수있는 능력은 공격자가 귀하의 사이트에서 승인되지 않은 코드를 실행하는 것을 훨씬 더 어렵게 만듭니다. " (Mike West, Google)


내 로컬 호스트 페이지에서 다른 호스트 스크립트를 추가 할 수있는 이유는 무엇입니까?
mqliutie

제 3 자 서버에서 호스팅되지 않은 스크립트 만하는 당신이 "신뢰"재사용하는 것은 드문 일이 아니다
로시오 가르시아 루케

7

전체 권한 문자열

이전 답변은 blob: data: gap:동시에 키워드를 포함하지 않기 때문에 내 문제를 해결하지 못했습니다 . 그래서 다음을 수행하는 문자열이 있습니다.

<meta http-equiv="Content-Security-Policy" content="default-src * self blob: data: gap:; style-src * self 'unsafe-inline' blob: data: gap:; script-src * 'self' 'unsafe-eval' 'unsafe-inline' blob: data: gap:; object-src * 'self' blob: data: gap:; img-src * self 'unsafe-inline' blob: data: gap:; connect-src self * 'unsafe-inline' blob: data: gap:; frame-src * self blob: data: gap:;">

경고 : 이로 인해 문서가 많은 악용에 노출됩니다. 사용자가 콘솔에서 코드를 실행하지 못하도록하거나 Cordova 애플리케이션 과 같은 폐쇄 된 환경에 있어야 합니다.


1
다음과 같이 콘솔에 JQuery를로드하려는 경우 정답입니다. stackoverflow.com/a/31912495/137948
Will Sheppard

4

이에 대해 좀 더 자세히 설명하려면

script-src 'self' http://somedomain 'unsafe-inline' 'unsafe-eval';

이렇게 메타 태그에

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; script-src 'self' https://somedomain.com/ 'unsafe-inline' 'unsafe-eval';  media-src *">

오류를 수정합니다.


2

이 정책을 무시하기 위해 메타 태그를 추가하는 것은 웹 서버가 Content-Security-Policy응답에 헤더를 삽입했기 때문에 도움이되지 않았습니다 .

우리의 경우 Ngnix를 Tomcat 9 Java 기반 애플리케이션 의 웹 서버로 사용하고 있습니다. 웹 서버에서 허용하지 않도록 브라우저에 지시 inline scripts하므로 임시 테스트를 위해 사용 중지했습니다.Content-Security-Policy 주석을 달아 사용 했습니다.

ngnix에서 끄는 방법

  • 기본적으로 ngnix ssl.conf 파일에는 응답에 헤더가 추가됩니다.

    #> grep 'Content-Security' -ir /etc/nginx/global/ssl.conf add_header Content-Security-Policy "default-src 'none'; frame-ancestors 'none'; script-src 'self'; img-src 'self'; style-src 'self'; base-uri 'self'; form-action 'self';";

  • 이 줄에 주석을 달고 ngnix를 다시 시작하면 응답에 헤더를 추가하지 않아야합니다.

보안 또는 프로덕션에 대해 우려되는 경우이 단계를 따르지 말고 테스트 목적으로 만이 단계를 사용하고 계속 진행하십시오.


-1

이 오류가 발생하는 가능한 이유는 / build를 추가했기 때문일 수 있습니다. 폴더를 .gitignore 파일에 추가했거나 일반적으로 Git에 체크인하지 .

따라서 Git에서 Heroku 마스터를 푸시 할 때 참조하는 빌드 폴더가 Heroku로 푸시되지 않습니다. 이것이이 오류를 보여주는 이유입니다.

이것이 로컬에서 제대로 작동하지만 Heroku에 배포 할 때는 작동하지 않는 이유입니다.


나는 같은 문제가 있습니다. 그래서 .gitignore에서 / build 폴더를 제거 할 것을 제안하고 있습니까?
Hoang Minh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.