“ ไม่พบเมตาแท็ก Content-Security-Policy” เกิดข้อผิดพลาดในแอปพลิเคชัน phonegap ของฉัน


94

หลังจากอัปเดต Cordova 5.0 ในระบบของฉันฉันสร้างแอปพลิเคชันใหม่ เมื่อฉันทดสอบแอปพลิเคชันของฉันบนอุปกรณ์ในครั้งนั้นฉันได้รับข้อผิดพลาดในบันทึกของคอนโซล:

No Content-Security-Policy meta tag found.
Please add one when using the Cordova-plugin-whitelist plugin.: 23.

ฉันเพิ่มเมตาในส่วนหัว

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

แต่อีกครั้งฉันได้รับข้อผิดพลาดเดียวกันในแอปพลิเคชันฉันใช้ปลั๊กอินเบราว์เซอร์ในแอปและลิงก์เว็บไซต์อื่น ๆ อีก 7 ลิงก์


3
คุณได้ติดตั้งปลั๊กอินcordova-plugin-whitelist- github.com/apache/cordova-plugin-whitelistอย่างถูกต้องหรือไม่? หลังจากนั้นคุณจะต้องเพิ่มconfig.xml<allow-navigation href="http://*/*" />ของคุณ
Keval

1
ขอบคุณ Keval หลังจากเพิ่ม <allow-navigation href = "http: // * / *" /> ตอนนี้แอปพลิเคชันของฉันทำงานได้ดี ขอบคุณอีกครั้ง


3
เมื่อสามารถสร้างข้อผิดพลาดเมื่ออักขระหนึ่งตัวหายไปในโค้ดเหตุใด SO จึงไม่อนุญาตให้แก้ไขที่มีอักขระน้อยกว่าหกอักขระ อันนี้แก้ไขได้ง่ายมากแค่พยายามช่วยคนอื่นไม่กี่วินาทีในอนาคต มีเครื่องหมายคำพูดคู่ที่ขาดหายไปที่ส่วนท้ายของแอตทริบิวต์เนื้อหาของเมตาแท็ก
Jason D.

คำตอบ:


86

หลังจากเพิ่มCordova-plugin-whitelistแล้วคุณต้องแจ้งให้แอปพลิเคชันของคุณอนุญาตให้เข้าถึงลิงก์ของหน้าเว็บทั้งหมดหรือลิงก์เฉพาะหากคุณต้องการให้เฉพาะเจาะจง

คุณสามารถเพิ่มสิ่งนี้ลงในconfig.xmlของคุณซึ่งสามารถพบได้ในไดเรกทอรีรากของแอปพลิเคชันของคุณ:

แนะนำในเอกสารประกอบ:

<allow-navigation href="http://example.com/*" />

หรือ:

<allow-navigation href="http://*/*" />

จากเอกสารของปลั๊กอิน:

รายการที่อนุญาตสำหรับการนำทาง

ควบคุม URL ที่ WebView สามารถนำทางไปได้ ใช้กับการนำทางระดับบนสุดเท่านั้น

Quirks: บน Android ยังใช้กับ iframe สำหรับรูปแบบที่ไม่ใช่ http

โดยค่าเริ่มต้นจะอนุญาตให้ใช้การนำทางไปยังไฟล์: // URL เท่านั้น ในการอนุญาต URL อื่นคุณต้องเพิ่มแท็กใน config.xml ของคุณ:

<!-- Allow links to example.com -->
<allow-navigation href="http://example.com/*" />

<!-- Wildcards are allowed for the protocol, as a prefix
     to the host, or as a suffix to the path -->
<allow-navigation href="*://*.example.com/*" />

<!-- A wildcard can be used to whitelist the entire network,
     over HTTP and HTTPS.
     *NOT RECOMMENDED* -->
<allow-navigation href="*" />

<!-- The above is equivalent to these three declarations -->
<allow-navigation href="http://*/*" />
<allow-navigation href="https://*/*" />
<allow-navigation href="data:*" />


38

คุณต้องเพิ่มเมตาแท็ก CSP ในส่วนหัวของแอปของคุณ index.html

ตามhttps://github.com/apache/cordova-plugin-whitelist#content-security-policy

นโยบายความปลอดภัยของเนื้อหา

ควบคุมคำขอเครือข่าย (รูปภาพ XHR ฯลฯ ) ที่อนุญาตให้ทำได้ (ผ่าน webview โดยตรง)

ใน Android และ iOS รายการที่อนุญาตพิเศษของคำขอเครือข่าย (ดูด้านบน) ไม่สามารถกรองคำขอทุกประเภทได้ (เช่น<video>& WebSockets จะไม่ถูกบล็อก) ดังนั้นนอกเหนือจากรายการที่อนุญาตแล้วคุณควรใช้ แท็กนโยบายความปลอดภัยของเนื้อหา <meta>ในทุกหน้าของคุณ

บน Android การรองรับ CSP ภายใน Webview ของระบบจะเริ่มต้นด้วย KitKat (แต่มีให้บริการในทุกเวอร์ชันที่ใช้ Crosswalk WebView)

ตัวอย่างการประกาศ CSP สำหรับ.htmlเพจของคุณมีดังนี้

<!-- Good default declaration:
    * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication
    * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly
    * Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this:
        * Enable inline JS: add 'unsafe-inline' to default-src
        * Enable eval(): add 'unsafe-eval' to default-src
-->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *">

<!-- Allow requests to foo.com -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com">

<!-- Enable all requests, inline styles, and eval() -->
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">

<!-- Allow XHRs via https only -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' https:">

<!-- Allow iframe to https://cordova.apache.org/ -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://cordova.apache.org">

เมื่อฉันเพิ่ม CSP Decleration โค้ดต่อไปนี้สำหรับ google map จะล้มเหลวเช่นนี้ ความคิดใด ๆ ? var pos = google.maps.LatLng ใหม่ (position.coords.latitude, position.coords.longitude); // บรรทัด 173 11-09 21: 17: 30.724: D / SystemWebChromeClient (25692): file: ///android_asset/www/index.html: Line 173: Uncaught ReferenceError: google ไม่ได้กำหนด
shamaleyte

1
ฉันต้องการปิดเมตาแท็กด้วย /> เพื่อให้รู้จัก
metamagikum

23

มีข้อผิดพลาดในเมตาแท็กของคุณ

ของคุณ:

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

แก้ไข:

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

สังเกตเครื่องหมายจุดคู่หลัง "script-src" และเครื่องหมายอัญประกาศคู่ท้ายของเมตาแท็ก


3
เมื่อฉันรวมการ<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'"/>รีโหลดแบบสดด้วยเฟรมเวิร์กไอออนิกหยุดทำงานดังนั้นโปรดระวังคนอื่นที่นั่น
CommonSenseCode

@codePlusPlus เพื่อเปิดใช้งาน Ionic livereload อีกครั้งเพิ่มhttp://localhost:35729ใน script-scr directive และคำสั่งws://localhost:35729connect-src
kolli

@kolli คุณช่วยแสดงให้เห็นได้ไหมว่าผู้เสียชีวิตคนใหม่จะเป็นอย่างไร? ยังไม่ชัดเจนว่าจะเพิ่มลงในคำสั่งอย่างไร
jessewolfe

ฉันเห็นข้อมูลอยู่ในโพสต์ต้นฉบับ แต่เพื่อความชัดเจน: โปรดทราบว่าการ "เพิ่ม" หมายความว่าคุณสามารถแทนที่ script-src 'self' 'unsafe-inline' 'unsafe-eval'ด้วย script-src 'self' http://localhost:35279 'unsafe-inline' 'unsafe-eval'และคุณจะเพิ่มคำสั่งใหม่ที่มีเครื่องหมายอัฒภาคคั่นไว้ที่ส่วนท้ายของแอตทริบิวต์เนื้อหา:; script-src ws://localhost:35279
jessewolfe

แก้ไขข้างต้น ... ; connect-src 'self' ws://localhost:35279สำหรับส่วนที่สองมันควรจะเป็น โปรดทราบว่าฉันได้รับข้อผิดพลาด (ไม่สามารถเข้าถึงไฟล์: // <path to index.html> เนื่องจากการละเมิด CSP) จนกว่าฉันจะเพิ่ม 'self'
jessewolfe

2

สำหรับฉันมันเพียงพอแล้วที่จะติดตั้งปลั๊กอินรายการที่อนุญาตใหม่:

cordova plugin remove cordova-plugin-whitelist

แล้ว

cordova plugin add cordova-plugin-whitelist

ดูเหมือนว่าการอัปเดตจาก Cordova เวอร์ชันก่อนหน้าจะไม่ประสบความสำเร็จ


1

สำหรับฉันปัญหาคือฉันใช้แพลตฟอร์มCordova androidและios ที่ล้าสมัย ดังนั้นการอัปเกรดเป็นandroid@5.1.1และios@4.0.1 จึงแก้ไขได้

คุณสามารถอัปเกรดเป็นเวอร์ชันเฉพาะเหล่านี้ได้:

cordova platforms rm android
cordova platforms add android@5.1.1
cordova platforms rm ios
cordova platforms add ios@4.0.1

คุณหมายถึง android 5.1.1หรือเปล่า?
mix3d

ฉันติดตามทั้งคำแนะนำของ @Maxim และ Pierre-Alexis de Solminihac และทำให้แอปของฉันทำงานได้ดีในที่สุด ขอบคุณ!
Zalakain

0

มีปัญหาอื่นเกี่ยวกับการเชื่อมต่อ Android บางเวอร์ชันสามารถเชื่อมต่อได้ แต่บางเวอร์ชันไม่สามารถเชื่อมต่อได้ ดังนั้นจึงมีทางออกอื่น

ใน AndroidManifest.xml:

<application ... android:usesCleartextTraffic="true">
        ...
    </application>

เพียงเพิ่ม 'android: usesCleartextTraffic = "true"'

และแก้ไขปัญหาได้ในที่สุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.