javascript 에러 - 크롬 확장 인라인 자바 스크립트 호출 오류를 수정하는 방법은 무엇입니까?



확장프로그램 디버깅 (2)

크롬 확장을 만들고 있지만 onclick () 이벤트를 실행하려고하면 다음과 같은 오류가 발생하는 것 같습니다.

Refused to load the script 'https://apis.google.com/js/client.js?onload=handleClientLoad' because it violates the following Content Security Policy directive: "script-src 'self' blob: filesystem: chrome-extension-resource:"

Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'self' blob: filesystem: chrome-extension-resource:". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution.

이건 내 매니 페스트 야 .json :

{
  "manifest_version": 2,

  "name": "SECURE",
  "description": "this extension offers secure communication for GMAIL     users",
  "version": "1.0",

 "browser_action": {
 "default_icon": "resources/icon16.png",
 "default_popup": "popup.html",
 "default_title": "Click here!"


 },

 "background":{
   "scripts":["background.js"]
},

 "content_scripts": [
  {
   "matches": ["http://*/*", "https://*/*"],
   "js":["myscript.js"],
   "run_at": "document_end"
  }
  ],
"permissions": ["identity", "https://accounts.google.com/*",  "https://www.googleapis.com/*"],

"oauth2": {
   "client_id": "975410329966.apps.googleusercontent.com",
 "scopes": [
   "<all urls>",
   "https://www.googleapis.com/auth/drive",
   "https://mail.google.com/",
   "https://www.googleapis.com/auth/gmail.login",
   "https://www.googleapis.com/auth/gmail.compose",
   "https://www.googleapis.com/auth/gmail.readonly",
   "https://www.googleapis.com/auth/gmail.send"
  ],

 "content_security_policy":"script-src 'self'  'unsafe-inline' 'unsafe eval'  https://apis.google.com/js/client.js?; object-src 'self'"


}
}

이 오류를 해결하기위한 도움은 크게 감사 할 것입니다.


Answers

기본적으로 Content Security Policy 에서는 인라인 스크립트가로드되지 않고 로컬 스크립트 만로드 할 수 있습니다. 기본 정책을 다음과 같이 완화 할 수 있습니다.

  1. 인라인 스크립트. Official Guide를 보면 인라인 스크립트는 정책에서 소스 코드의 base64 인코딩 해시를 지정하여 허용 목록에 포함될 수 있습니다. 예제의 요소에 대한 해시 사용법을 참조하십시오.

    그러나 더 나은 방법은이 논리를 별도의 스크립트로 추출하고 인라인 스크립트를 사용하지 않을 것이라고 생각합니다.

  2. 원격 스크립트. manifest.json 의 다음 섹션에서 스크립트 리소스 https://apis.google.com/js/client.js?onload=handleClientLoad 를 허용 목록에 추가 할 수 있습니다.

    "content_security_policy":"script-src 'self' https://apis.google.com; object-src 'self'"
    

    또한 원격 client.js 다운로드하고 로컬 스크립트로 포함시키는 것이 더 나은 방법이라고 생각합니다.

인라인 스크립트에 대한 설명에 따라 unsafe-inline 더 이상 작동하지 않습니다.

Chrome 45까지는 인라인 JavaScript 실행에 대한 제한을 완화 할 수있는 메커니즘이 없었습니다. 특히 '안전하지 않은 인라인'을 포함하는 스크립트 정책을 적용하면 아무 효과가 없습니다 .


못생긴 -1 수표를 작성하는 대안을 찾고 있다면 대신 ~ 물결표를 앞에 붙입니다.

if (~haystack.indexOf('needle')) alert('found');

Joe Zimmerman - ~에 -1을 사용하면 0으로 변환됩니다. 숫자 0은 거짓 값입니다. 즉, 부울 값으로 변환 될 때 false로 평가됩니다. 처음에는 큰 통찰력처럼 보이지 않을 수도 있지만 indexOf와 같은 함수는 쿼리를 찾을 수 없을 때 -1을 반환합니다. 이것은 다음과 비슷한 것을 쓰는 대신에 :

if (someStr.indexOf("a") >= 0) {
  // Found it
} else  {
  // Not Found
}

이제 코드에서 더 적은 문자를 사용할 수 있으므로 다음과 같이 작성할 수 있습니다.

if (~someStr.indexOf("a")) {
  // Found it
} else  {
  // Not Found
}

자세한 내용은 여기에





javascript google-chrome google-chrome-extension content-security-policy