ปฏิเสธที่จะโหลดสคริปต์เนื่องจากละเมิดคำสั่งนโยบายความปลอดภัยของเนื้อหาต่อไปนี้


112

เมื่อฉันพยายามปรับใช้แอปของฉันบนอุปกรณ์ที่มีระบบ Android ที่สูงกว่า 5.0.0 ( Lollipop ) ฉันยังคงได้รับข้อความแสดงข้อผิดพลาดประเภทนี้:

07-03 18: 39: 21.621: D / SystemWebChromeClient (9132): file: ///android_asset/www/index.html: Line 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' 'ไม่ปลอดภัยอินไลน์' "

อย่างไรก็ตามหากฉันปรับใช้กับอุปกรณ์มือถือที่มีระบบ 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 หากคุณต้องการดึงข้อมูล JSON บางส่วนจาก API ผ่าน JS เช่น tampermonkey addon หรืออย่างอื่นคุณสามารถใช้ปลั๊กอินนี้chrome.google.com/webstore/detail/disable-content-security/…และปิดการใช้งานการตรวจสอบ CSP ในขณะที่คุณต้องการขอรับ บางอย่าง แม้ว่าจะไม่ปลอดภัย แต่ในบางกรณีก็อาจได้ผล ฉันโพสต์คำตอบนี้ที่นี่เพราะฉันกำลังมองหาข้อผิดพลาดของฉันและหัวข้อนี้ปรากฏเป็นอันดับแรกใน Google
Eryk Wróbel

คำตอบ:


72

ลองแทนที่เมตาแท็กของคุณด้วยสิ่งนี้ด้านล่าง:

<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-srcและscript-srcตามที่เห็นด้านบนเพิ่มหลังจาก "self"

หากเซิร์ฟเวอร์ของคุณรวมContent-Security-Policyส่วนหัวส่วนหัวจะลบล้างเมตา


7
ตามที่ฉันเข้าใจ CSP ที่คุณกำหนดไว้ที่นี่ปิดใช้งานการรักษาความปลอดภัยทุกประเภทเพื่อหลีกเลี่ยงการโจมตีทำให้แท็กสคริปต์และโหลดสคริปต์จากโดเมนใดก็ได้และผ่านการเชื่อมต่อที่ไม่ปลอดภัย ดูDevelopers.google.com/web/fundamentals/security/cspหรือขอรับ s.th ไม่ถูกต้อง? ฉันเดาว่าในกรณีส่วนใหญ่ (ยกเว้นจากการพัฒนาและการดีบัก) นี่ไม่ใช่สิ่งที่คุณต้องการ ... ใช่มั้ย?
Peter T.

1
นอกจากนี้โปรดดูinfosec.mozilla.org/guidelines/…
Peter T.

12
ฉันจะลงคะแนนคำตอบนี้เนื่องจากคุณแนะนำให้ใช้ '' ไม่ปลอดภัยในบรรทัด '' ไม่ปลอดภัยประเมิน '' ซึ่งคุณไม่ควรใช้เมื่อใช้ CSP!
HerTesla

42

คำตอบตัวเองได้รับจาก MagngooSasaไม่หลอกลวง แต่สำหรับคนอื่นพยายามที่จะเข้าใจคำตอบที่นี่มีไม่กี่บิตรายละเอียดเพิ่มเติมได้ที่:

เมื่อพัฒนาแอปCordovaด้วย Visual Studio ฉันพยายามนำเข้าไฟล์ 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';

49
คุณช่วยอธิบายเพิ่มเติมอีกหน่อยได้ไหม คุณสามารถวาง meta แบบเต็มได้หรือไม่?
Tony

4
@dyoser นี่คือข้อมูลอ้างอิงdeveloper.chrome.com/extensions/contentSecurityPolicy#relaxing
igaurav

4
สิ่งนี้ปิดใช้งาน CSP สำหรับสคริปต์ได้อย่างมีประสิทธิภาพโดยอนุญาตให้ปลั๊กอิน / xss ที่เป็นอันตรายใด ๆ ฉีดอินไลน์และสคริปต์ประเมินซึ่งเอาชนะวัตถุประสงค์ทั้งหมดของการเปิดใช้งาน CSP เลย
IncredibleHat

8

เราใช้สิ่งนี้:

<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'">

8

สตริงสิทธิ์แบบเต็ม

คำตอบก่อนหน้านี้ไม่สามารถแก้ไขปัญหาของฉันได้เนื่องจากไม่ได้รวม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

8

สำหรับใครที่กำลังมองหาคำอธิบายที่สมบูรณ์ผมแนะนำให้คุณดูที่นโยบายการรักษาความปลอดภัยเนื้อหา: https://www.html5rocks.com/en/tutorials/security/content-security-policy/

"รหัสจากhttps://mybank.comควรเข้าถึงได้เฉพาะข้อมูลของ https: //mybank.com และhttps://evil.example.comจะไม่ได้รับอนุญาตให้เข้าถึงอย่างแน่นอนแหล่งที่มาแต่ละรายการจะแยกออกจากส่วนที่เหลือของ เว็บ "

การโจมตี XSS ขึ้นอยู่กับการที่เบราว์เซอร์ไม่สามารถแยกแยะรหัสของแอปของคุณออกจากรหัสที่ดาวน์โหลดจากเว็บไซต์อื่น ดังนั้นคุณต้องอนุญาตต้นกำเนิดของเนื้อหาที่คุณคิดว่าปลอดภัยในการดาวน์โหลดเนื้อหาโดยใช้Content-Security-Policyส่วนหัว HTTP

นโยบายนี้อธิบายโดยใช้ชุดคำสั่งนโยบายซึ่งแต่ละนโยบายอธิบายถึงนโยบายสำหรับประเภททรัพยากรหรือพื้นที่นโยบายบางประเภท นโยบายของคุณควรมีคำสั่งนโยบาย 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';** ">

คุณจะบอกว่าคุณกำลังอำนาจการดำเนินการของโค้ด JavaScript (คนscript-src) จากต้นกำเนิด'self', http://onlineerp.solution.quebec, ,'unsafe-inline''unsafe-eval'

ฉันเดาว่าสองข้อแรกใช้ได้อย่างสมบูรณ์แบบสำหรับกรณีการใช้งานของคุณฉันไม่แน่ใจเกี่ยวกับอันอื่นเล็กน้อย 'unsafe-line'และ'unsafe-eval'ก่อให้เกิดปัญหาด้านความปลอดภัยดังนั้นคุณไม่ควรใช้สิ่งเหล่านี้เว้นแต่คุณจะมีความต้องการเฉพาะเจาะจง

"หาก eval และพี่น้อง text-to-JavaScript มีความจำเป็นอย่างยิ่งต่อแอปพลิเคชันของคุณคุณสามารถเปิดใช้งานได้โดยการเพิ่ม 'unsafe-eval' เป็นซอร์สที่อนุญาตในคำสั่ง script-src แต่โปรดอย่าแบน ความสามารถในการดำเนินการสตริงทำให้ผู้โจมตีดำเนินการโค้ดที่ไม่ได้รับอนุญาตบนไซต์ของคุณได้ยากขึ้นมาก " (Mike West, Google)


เหตุใดในหน้า localhost ของฉันฉันจึงสามารถต่อท้ายสคริปต์โฮสต์อื่นได้
mqliutie

ไม่ใช่เรื่องแปลกที่จะนำสคริปต์ของบุคคลที่สามที่ไม่ได้โฮสต์ในเซิร์ฟเวอร์ของคุณมาใช้ซ้ำ แต่เป็นสิ่งที่คุณ "เชื่อใจ"
Luque

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 ไม่ควรเพิ่มส่วนหัวในการตอบกลับ

หากคุณกังวลเกี่ยวกับความปลอดภัยหรือในการผลิตโปรดอย่าทำตามขั้นตอนนี้ใช้ขั้นตอนเหล่านี้เพื่อวัตถุประสงค์ในการทดสอบเท่านั้นและดำเนินการต่อไป


-2

สาเหตุที่เป็นไปได้ว่าทำไมคุณถึงได้รับข้อผิดพลาดนี้น่าจะเป็นเพราะคุณได้เพิ่มโฟลเดอร์/ buildในไฟล์. gitignore ของคุณหรือโดยทั่วไปยังไม่ได้ตรวจสอบใน Git

ดังนั้นเมื่อคุณ Git กดHeroku master โฟลเดอร์ build ที่คุณอ้างอิงจะไม่ถูกผลักไปที่ Heroku และนั่นเป็นสาเหตุที่แสดงข้อผิดพลาดนี้

นั่นเป็นเหตุผลที่มันทำงานได้อย่างถูกต้องในพื้นที่ แต่ไม่ใช่เมื่อคุณนำไปใช้กับ Heroku


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