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.