CORS กับ POSTMAN


95

มีการถามเรื่องนี้สองสามครั้ง แต่ฉันยังไม่เข้าใจบางอย่าง:

เมื่อฉันอ่านคำตอบเกี่ยวกับ

ไม่มีส่วนหัว "Access-Control-Allow-Origin"

add_header 'Access-Control-Allow-Origin' '*';ปัญหาก็กล่าวว่าการตั้งค่าที่ควรจะตั้งบนเซิร์ฟเวอร์ที่ร้องขอเพื่อให้ข้ามโดเมน:

แต่ช่วยบอกหน่อยว่าทำไมเวลาถามจากบุรุษไปรษณีย์ (ซึ่งเป็นลูกค้า) มันใช้งานได้ดีและฉันได้รับคำตอบจากเซิร์ฟเวอร์ที่ร้องขอ

ขอขอบคุณ


25
บุรุษไปรษณีย์ไม่สนใจ SOP แต่เป็นเครื่องมือพัฒนาไม่ใช่เบราว์เซอร์
มูซา

2
@Musa Ok ดังนั้นหากเป็นปัญหาของเบราว์เซอร์ (ไคลเอนต์) เหตุใดฉันจึงต้องแก้ไขบางอย่างบนเซิร์ฟเวอร์
IsraGab

8
เป็นเซิร์ฟเวอร์ที่บอกเบราว์เซอร์ว่าโอเค ( CORS ) หรือไม่สำหรับไซต์หนึ่ง ๆ ในการเข้าถึงเนื้อหาและเบราว์เซอร์ให้เกียรติมัน
มูซา

ฉันมีคำถามเหมือนกัน เราจะทำแบบนั้นได้อย่างไรในกรณีนี้กับอิเล็กตรอน
mluis

10
คำถามจริงนี่คือวิธีกำหนดค่า POSTMAN เพื่อเลียนแบบพฤติกรรมของเบราว์เซอร์ที่ส่งคำขอ ORIGIN ก่อน โดยพื้นฐานแล้ววิธีทำให้ POSTMAN ทำงานเหมือนเบราว์เซอร์เพราะเราจำเป็นต้องทดสอบเพื่อให้แน่ใจว่า API ของเรากำหนดค่าได้อย่างถูกต้อง แล้วจะเกิดอะไรขึ้นถ้า API ทำงานจาก POSTMAN และมันแตกเนื่องจาก CORS จากเบราว์เซอร์ หมายความว่า API ไม่มีประโยชน์
Chris Love

คำตอบ:


51

ตามที่ @Musa แสดงความคิดเห็นดูเหมือนว่าเหตุผลคือ:

บุรุษไปรษณีย์ไม่สนใจ SOP แต่เป็นเครื่องมือพัฒนาไม่ใช่เบราว์เซอร์

อย่างไรก็ตามนี่คือส่วนขยายของ Chromeเพื่อให้สามารถใช้งานได้บนเบราว์เซอร์ของคุณ (อันนี้ใช้สำหรับ chrome แต่คุณสามารถค้นหา FF หรือ Safari ได้)

ตรวจสอบที่นี่หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับCross-Originและเหตุใดจึงใช้งานได้กับส่วนขยาย


6
แล้วฉันจะป้องกันเส้นทาง API ของฉันที่ถูกเข้าถึงจากเครื่องมือเช่นบุรุษไปรษณีย์ได้อย่างไร? ตัวอย่างเช่น API ที่ต้องมีการยืนยันแคปต์ชา แต่ถ้าเข้าถึงโดยตรงจากบุรุษไปรษณีย์การตรวจสอบ captcha จะถูกข้ามไป
Sadman Muhib Samyo

5
ลิงก์ไปยังส่วนขยายเสีย
jayarjo

คำถามเดียวกันนอกจากนี้ส่วนขยายจะทำลายนโยบายแหล่งที่มาเดียวได้อย่างไร
IvánCortés Romero

ลิงก์ไปยัง chrome-extension เสีย
OhadR

46

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

ในที่สุดสิ่งนั้นก็ จำกัด เกินไป แต่แนวคิดเริ่มต้นยังคงอยู่ในเบราว์เซอร์ อย่าปล่อยให้หน้าเว็บส่งข้อมูลไปยังโดเมนอื่น แต่นี่คือการตรวจสอบเบราว์เซอร์ทั้งหมด Chrome และ firefox ฯลฯ มีโค้ดในตัวที่ระบุว่า 'ก่อนส่งคำขอนี้เราจะตรวจสอบว่าปลายทางตรงกับหน้าที่กำลังเข้าชม'

บุรุษไปรษณีย์ (หรือ CURL ในบรรทัด cmd) ไม่มีเช็คในตัว คุณกำลังโต้ตอบกับไซต์ด้วยตนเองดังนั้นคุณจึงสามารถควบคุมสิ่งที่คุณส่งได้อย่างเต็มที่


2
บุรุษไปรษณีย์ที่ถูกต้องมากขึ้นจะไม่ส่งคำขอ XmlHttp ที่จะได้รับการตรวจสอบ แต่เป็นการโทรจากเครือข่ายระดับบนสุด (เช่นการเปิด URL บนแท็บเบราว์เซอร์ใหม่) ดังนั้นจึงไม่ถูกเตะเข้าแม้ว่าจะอยู่ในส่วนขยาย
tgkprog

1
เบราว์เซอร์ไม่ได้ตรวจสอบว่าไซต์ของคุณไม่ได้ส่งข้อมูลไปยังโดเมนอื่น: หากไซต์โดเมนอื่นอนุญาตให้ใช้แหล่งที่มาทั้งหมดเบราว์เซอร์ของคุณก็ใช้ได้ 100% ตรงกันข้ามเป็นการปกป้องโดเมนอื่นในกรณีที่ไซต์ของคุณใช้ทรัพยากรโดยไม่ได้รับอนุญาต
XouDo

40

CORS(ทรัพยากรข้ามแหล่งที่ใช้ร่วมกัน) และSOP(แหล่งกำเนิดเดียวกันนโยบาย) การกำหนดค่าฝั่งเซิร์ฟเวอร์ที่ลูกค้าตัดสินใจที่จะบังคับใช้หรือไม่

ที่เกี่ยวข้องกับลูกค้า

  • เบราว์เซอร์ ส่วนใหญ่บังคับใช้เพื่อป้องกันปัญหาที่เกี่ยวข้องกับการCSRFโจมตี
  • เครื่องมือการพัฒนา ส่วนใหญ่ไม่สนใจมัน

14

แม้ว่าคำตอบทั้งหมดที่นี่จะเป็นคำอธิบายที่ดีจริงๆว่า cors คืออะไร แต่คำตอบโดยตรงสำหรับคำถามของคุณอาจเป็นเพราะบุรุษไปรษณีย์และเบราว์เซอร์ที่แตกต่างกันดังต่อไปนี้

เบราว์เซอร์: ส่งการOPTIONSโทรเพื่อตรวจสอบประเภทเซิร์ฟเวอร์และรับส่วนหัวก่อนที่จะส่งคำขอใหม่ไปยังปลายทาง API Access-Control-Allow-Originไหนจะตรวจสอบ โดยคำนึงถึงAccess-Control-Allow-Originส่วนหัวนี้เพียงแค่ระบุว่า CROSS ORIGINS ใดที่ได้รับอนุญาตแม้ว่าโดยค่าเริ่มต้นเบราว์เซอร์จะอนุญาตให้ใช้แหล่งกำเนิดเดียวกันเท่านั้น

บุรุษไปรษณีย์: ส่งโดยตรงGET, POST, PUT, DELETEคำขอ ฯลฯ โดยไม่ต้องตรวจสอบสิ่งที่ประเภทของเซิร์ฟเวอร์และได้รับส่วนหัวAccess-Control-Allow-Originโดยใช้OPTIONSการโทรไปยังเซิร์ฟเวอร์


"ส่งการเรียก OPTIONS เพื่อตรวจสอบประเภทเซิร์ฟเวอร์และรับส่วนหัวก่อนที่จะส่งคำขอใหม่ไปยังปลายทาง API" - นั่นไม่เป็นความจริง จะทำเช่นนั้นสำหรับคำขอที่ไม่ใช่แบบง่ายเท่านั้น
Quentin

2

โดยทั่วไปแล้วบุรุษไปรษณีย์ใช้สำหรับการดีบักและใช้ในขั้นตอนการพัฒนา แต่ในกรณีที่คุณต้องการบล็อกแม้กระทั่งจากบุรุษไปรษณีย์ลองทำเช่นนี้

    const referrer_domain = "[enter-the-domain-name-of-the-referrer]"
    //check for the referrer domain
    app.all('/*', function(req, res, next) {
      if(req.headers.referer.indexOf(referrer_domain) == -1){
        res.send('Invalid Request')
      }

      next();
    });

เพิ่มรหัสในไฟล์ของคุณด้วยเราเตอร์ หากคุณมีไฟล์ที่มี "เราเตอร์" ให้เพิ่มรหัสที่ด้านบนของไฟล์ ไฟล์เดียวกับที่คุณมี: const express = require ('express') const app = express (); const cors = ต้องใช้ ('cors');
samceena

แก้ไขในapp.jsกรณีที่คุณใช้node app.jsเพื่อเรียกใช้เซิร์ฟเวอร์
Bharath Pabba

สามารถปกป้องเซิร์ฟเวอร์ของคุณจาก ddos ​​ได้หรือไม่
SuperUberDuper

-1

ใช้เบราว์เซอร์ / ปลั๊กอินบุรุษไปรษณีย์ chrome เพื่อตรวจสอบ CORS / SOP เหมือนเว็บไซต์ ใช้แอปพลิเคชันเดสก์ท็อปแทนเพื่อหลีกเลี่ยงการควบคุมเหล่านี้

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