Ajax โดยใช้ https บนหน้า http


101

เว็บไซต์ของฉันใช้โปรโตคอล http และ https ไม่ส่งผลกระทบต่อเนื้อหา ไซต์ของฉันใช้การโทร jQuery ajax ซึ่งเติมเต็มพื้นที่บางส่วนบนหน้าเว็บด้วย

ตอนนี้ฉันต้องการโทร ajax ทั้งหมดผ่าน https (โปรดอย่าถามฉันว่าทำไม :)) เมื่อฉันอยู่บนเพจที่มีโปรโตคอล https คำขอ ajax กำลังทำงาน เมื่อฉันอยู่บนหน้าที่มีโปรโตคอล http ฉันได้รับข้อผิดพลาดของจาวาสคริปต์: การเข้าถึง URI ที่ จำกัด ถูกปฏิเสธ

ฉันรู้ว่านี่เป็นปัญหาข้ามโดเมน (อันที่จริงมันเป็นปัญหาข้ามโปรโตคอล) และฉันรู้ว่าฉันควรใช้โปรโตคอลเดียวกันในการโทร ajax เหมือนในหน้าปัจจุบัน

ถึงกระนั้นฉันต้องการให้การโทรของ ajax ทั้งหมดเป็น https และเรียกพวกเขาบนหน้าที่แสดงบน http มีวิธีแก้ปัญหาเพื่อให้บรรลุสิ่งนี้ (โซลูชัน json / proxy บางตัวหรือไม่) หรือเป็นไปไม่ได้เลย?


4
ทำไมไม่จับคู่ ajax กับโปรโตคอลหน้าโหลด
scheibk

45
พวกเขาพูดเป็นพิเศษว่า "ได้โปรดอย่าถามฉันว่าทำไม"
Chris Moschini

ทำไมคุณต้องใช้ AJAX กับ HTTPS ทั้งๆ .....
ไมล์

4
ตัวอย่างเช่นสำหรับแบบฟอร์มการชำระเงินที่มีการเปลี่ยนแปลงมากขึ้นซึ่งเชื่อมต่อกับเกตเวย์การชำระเงินเช่น paypal ในพื้นหลังเพื่อให้ผู้คนเห็นสิ่งที่เกิดขึ้น .. เพียงหนึ่งในความเป็นไปได้มากขึ้น
kentor

คำตอบ:


58

เพิ่มส่วนหัว Access-Control-Allow-Origin จากเซิร์ฟเวอร์

Access-Control-Allow-Origin: https://www.mysite.com

http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing


7
การตอบสนองที่ยอดเยี่ยม - แต่ไม่รองรับเบราว์เซอร์ที่ใช้บางตัวเช่น Opera (ไม่ใช่เลย) และ Internet Explorer (รองรับตั้งแต่เวอร์ชัน 8) caniuse.com/#search=cors
SimonSimCity

1
ดูเหมือนว่า Opera จะรองรับแล้ว: en.wikipedia.org/wiki/…ไม่ใช่ Opera Mini เท่านั้น ...
gitaarik

11

ลองใช้ JSONP

ไลบรารี JS ส่วนใหญ่ทำให้ง่ายเหมือนกับการเรียก AJAX อื่น ๆ แต่ใช้ iframe ภายในเพื่อทำแบบสอบถาม

หากคุณไม่ได้ใช้ JSON สำหรับ payload ของคุณคุณจะต้องหมุนกลไกของคุณเองรอบ ๆ iframe

ส่วนตัวฉันแค่เปลี่ยนเส้นทางจากหน้า http: // ไปที่ https: // หนึ่ง


1
อืมฉันได้ลอง jquery .ajax กับ jsonp: ชุดตัวเลือก 'jsonp_callback' แล้ว แต่ยังมีข้อผิดพลาด js เหมือนเดิม
user135863

บางทีคุณอาจต้องเพิ่มพารามิเตอร์การเรียกกลับใน URL
Javier

@ user135863 ปลายทางที่คุณส่งแบบสอบถามสนับสนุน JSONP ตั้งแต่แรกหรือไม่
Leigh Brenecki

1
เพื่อความมีสติของฉันฉันจะไปกับตัวเลือกสุดท้ายของคุณ ... เปลี่ยนเส้นทางง่ายๆไปที่https:
Dzeimsas Zvirblis

9

http://example.com/อาจแก้ไขเป็น VirtualHost ที่แตกต่างจากhttps://example.com/ (ซึ่งเนื่องจากไม่ได้ส่งส่วนหัวของโฮสต์จะตอบสนองต่อค่าเริ่มต้นสำหรับ IP นั้น) ดังนั้นทั้งสองจึงถือว่าแยกกัน โดเมนและอยู่ภายใต้ข้อ จำกัด ของ JS ข้ามโดเมน

การเรียกกลับ JSONอาจช่วยให้คุณหลีกเลี่ยงสิ่งนี้ได้


ลิงก์ที่ตายแล้วในการโทรกลับของ JSON :(
Kubie

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

เพิ่งสังเกตเห็น 10 ปีฮ่า ... และใช่จุดที่ดี ไม่เป็นไร Google จะตอบคำถามนี้และแก้ไขคำตอบหากฉันพบอะไร
Kubie

4

ตรวจสอบโครงการ opensource Forge มีการใช้งาน JavaScript TLS พร้อมกับ Flash บางตัวเพื่อจัดการคำขอข้ามโดเมนจริง:

http://github.com/digitalbazaar/forge/blob/master/README

กล่าวโดยย่อคือ Forge จะช่วยให้คุณสร้าง XmlHttpRequests จากหน้าเว็บที่โหลดผ่าน http ไปยังไซต์ https คุณจะต้องจัดเตรียมไฟล์นโยบายข้ามโดเมน Flash ผ่านเซิร์ฟเวอร์ของคุณเพื่อเปิดใช้งานคำขอข้ามโดเมน ดูบล็อกโพสต์ในตอนท้ายของ README เพื่อรับคำอธิบายเชิงลึกเกี่ยวกับวิธีการทำงาน

อย่างไรก็ตามฉันควรพูดถึงว่า Forge เหมาะสำหรับคำขอระหว่างสองโดเมน https ที่แตกต่างกัน เหตุผลก็คืออาจมีการโจมตี MiTM หากคุณโหลด JavaScript และ Flash จากไซต์ที่ไม่ปลอดภัยอาจถูกบุกรุกได้ การใช้งานที่ปลอดภัยที่สุดคือการโหลดจากไซต์ที่ปลอดภัยแล้วใช้เพื่อเข้าถึงไซต์อื่น ๆ (ปลอดภัยหรืออย่างอื่น)


2

คุณสามารถลองโหลดหน้า https ใน iframe และกำหนดเส้นทางคำขอของ ajax ทั้งหมดเข้า / ออกจากเฟรมผ่านสะพานบางตัวมันเป็นแฮ็กการ์ราวด์ แต่อาจใช้งานได้ (ไม่แน่ใจว่าจะกำหนดข้อ จำกัด การเข้าถึงเดียวกันหรือไม่ในบริบทที่ปลอดภัย) . มิฉะนั้นพร็อกซี http ภายในเพื่อกำหนดเส้นทางคำขอใหม่ (เช่นการเรียกข้ามโดเมน) จะเป็นโซลูชันที่ยอมรับ


2
หลังจากอ่านกระทู้นี้แล้วฉันจะติด JSONP dslreports.com/forum/r21425467-IFrame-With-HTTPS-on-HTTP-Page
JGFMK

สามารถทำได้ แต่อย่าลืมตั้งค่าส่วนหัว P3P หากคุณต้องการคุกกี้เซสชันจาก iFrame ... มิฉะนั้น MSE จะพูดว่า "nu uh uh"
srquinn

2

นี่คือสิ่งที่ฉันทำ:

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


สามารถทำได้ แต่อย่าลืมตั้งค่าส่วนหัว P3P หากคุณต้องการคุกกี้เซสชันจาก iFrame ... มิฉะนั้น MSE จะพูดว่า "nu uh uh"
srquinn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.