คุณจะดีบักคำขอ CORS ด้วย cURL ได้อย่างไร


300

คุณสามารถดีบักการร้องขอ CORS โดยใช้ cURL ได้อย่างไร จนถึงตอนนี้ฉันไม่พบวิธีที่จะ "จำลอง" คำขอ preflight

คำตอบ:


496

นี่คือวิธีที่คุณสามารถดีบักคำขอ CORS โดยใช้ curl

การส่งคำขอ CORS ปกติโดยใช้ cUrl:

curl -H "Origin: http://example.com" --verbose \
  https://www.googleapis.com/discovery/v1/apis?fields=

การ-H "Origin: http://example.com"ตั้งค่าสถานะเป็นโดเมนบุคคลที่สามที่ทำการร้องขอ ทดแทนสิ่งที่โดเมนของคุณเป็น

--verboseธงพิมพ์ออกมาตอบสนองทั้งเพื่อให้คุณสามารถดูคำขอและการตอบสนองส่วนหัว

URL ที่ฉันใช้ด้านบนเป็นคำขอตัวอย่างไปยัง Google API ที่สนับสนุน CORS แต่คุณสามารถแทนที่ URL ที่คุณกำลังทดสอบได้

การตอบสนองควรมีAccess-Control-Allow-Originส่วนหัว

การส่งคำขอ preflight โดยใช้ cUrl:

curl -H "Origin: http://example.com" \
  -H "Access-Control-Request-Method: POST" \
  -H "Access-Control-Request-Headers: X-Requested-With" \
  -X OPTIONS --verbose \
  https://www.googleapis.com/discovery/v1/apis?fields=

สิ่งนี้มีลักษณะคล้ายกับคำขอ CORS ปกติที่มีการเพิ่มเติมเล็กน้อย:

-Hธงส่งส่วนหัวของคำขอ preflight เพิ่มเติมไปยังเซิร์ฟเวอร์

การ-X OPTIONSตั้งค่าสถานะบ่งชี้ว่านี่เป็นคำขอ HTTP OPTIONS

ถ้าคำขอ preflight จะประสบความสำเร็จการตอบสนองควรมีAccess-Control-Allow-Origin, Access-Control-Allow-Methodsและ Access-Control-Allow-Headersส่วนหัวของการตอบสนอง หากคำขอ preflight ไม่สำเร็จส่วนหัวเหล่านี้ไม่ควรปรากฏมิเช่นนั้นการตอบสนอง HTTP จะไม่เท่ากับ 200

คุณยังสามารถระบุส่วนหัวเพิ่มเติมเช่นUser-Agentโดยใช้การ-Hตั้งค่าสถานะ


2
หน้านั้นดูเหมือนจะไม่ส่งคืนส่วนหัวของ CORS ใดถูกต้องหรือไม่
Janus Troelsen

1
เพื่อที่จะดูส่วนหัวที่เกิดขึ้นจริงคุณจะต้องเพิ่ม--verboseตัวเลือกดังกล่าวข้างต้น
monsur

10
หรือ--head:curl -H "Origin: http://example.com" --head https://www.googleapis.com/discovery/v1/apis\?fields\=
John Bachir

2
ใช้ - รวมถึงเพื่อดูส่วนหัว
Mika Tuupola

7
ในกรณีของ S3 curl -H "Access-Control-Request-Method: GET" -H "Origin: http://example.com" -I https://s3.amazonaws.com/your-bucket/fileที่ส่วนหัวตามที่มีการเพิ่มเฉพาะในกรณีที่วิธีการที่เหมาะสมที่จะได้รับคุณสามารถทำได้โดยใช้
Joscha

52

อัปเดตคำตอบที่ครอบคลุมกรณีส่วนใหญ่

curl -H "Access-Control-Request-Method: GET" -H "Origin: http://localhost" --head http://www.example.com/
  1. แทนที่http://www.example.com/ด้วย URL ที่คุณต้องการทดสอบ
  2. หากการตอบสนองAccess-Control-Allow-*นั้นรวมถึงทรัพยากรของคุณก็รองรับ CORS

เหตุผลสำหรับคำตอบทางเลือก

ฉัน google คำถามนี้ทุกครั้งแล้วคำตอบที่ยอมรับคือสิ่งที่ฉันต้องการ ครั้งแรกมันพิมพ์เนื้อหาการตอบสนองซึ่งเป็นข้อความจำนวนมาก การเพิ่ม--headเอาต์พุตเฉพาะส่วนหัว ประการที่สองเมื่อการทดสอบ S3 URL -H "Access-Control-Request-Method: GET"ที่เราต้องให้หัวเพิ่มเติม

หวังว่านี่จะช่วยประหยัดเวลา


2
ถ้าฉันขดโดยไม่มีการตั้งค่าจุดเริ่มต้นและฉันสามารถรับการตอบกลับและส่วนหัว (รวมถึงการเข้าถึงการควบคุมการอนุญาตส่วนหัว) กลับนั่นหมายความว่าฉันตั้งค่า CORS ของฉันไม่ถูกต้องหรือไม่? curl -X รับ ' endpoint.com ' -H 'การควบคุมแคช: no-cache' --head
Jun711

การหา @Jun เดียวกัน
Lukas Lukac

1
นี้ต้องอาศัย--headการทำพิมพ์ขดออกหัว แต่ก็ยังทำให้ขดทำให้คำขอมากกว่าHEAD GETคุณอาจต้องการGETส่งคำขอทั้งนี้ขึ้นอยู่กับสิ่งที่คุณทำการทดสอบ --IXGETคุณสามารถทำได้โดยการเพิ่ม
Aidan Fitzpatrick

2
ไม่ย้อนหลังหรือ ต้นกำเนิดไม่ควรเป็น example.com แทนใช่หรือไม่
ดัสตินอินแกรม

4

สคริปต์ทุบตี "corstest" ด้านล่างใช้งานได้สำหรับฉัน มันขึ้นอยู่กับความคิดเห็นของ Junข้างต้น

การใช้

corstest [-v] url

ตัวอย่าง

./corstest https://api.coindesk.com/v1/bpi/currentprice.json
https://api.coindesk.com/v1/bpi/currentprice.json Access-Control-Allow-Origin: *

ผลลัพธ์ที่เป็นบวกจะแสดงเป็นสีเขียว

./corstest https://github.com/IonicaBizau/jsonrequest
https://github.com/IonicaBizau/jsonrequest does not support CORS
you might want to visit https://enable-cors.org/ to find out how to enable CORS

ผลลบจะแสดงเป็นสีแดงและสีน้ำเงิน

ตัวเลือก -v จะแสดงส่วนหัวของขดเต็ม

corstest

#!/bin/bash
# WF 2018-09-20
# https://stackoverflow.com/a/47609921/1497139

#ansi colors
#http://www.csc.uvic.ca/~sae/seng265/fall04/tips/s265s047-tips/bash-using-colors.html
blue='\033[0;34m'  
red='\033[0;31m'  
green='\033[0;32m' # '\e[1;32m' is too bright for white bg.
endColor='\033[0m'

#
# a colored message 
#   params:
#     1: l_color - the color of the message
#     2: l_msg - the message to display
#
color_msg() {
  local l_color="$1"
  local l_msg="$2"
  echo -e "${l_color}$l_msg${endColor}"
}


#
# show the usage
#
usage() {
  echo "usage: [-v] $0 url"
  echo "  -v |--verbose: show curl result" 
  exit 1 
}

if [ $# -lt 1 ]
then
  usage
fi

# commandline option
while [  "$1" != ""  ]
do
  url=$1
  shift

  # optionally show usage
  case $url in      
    -v|--verbose)
       verbose=true;
       ;;          
  esac
done  


if [ "$verbose" = "true" ]
then
  curl -s -X GET $url -H 'Cache-Control: no-cache' --head 
fi
origin=$(curl -s -X GET $url -H 'Cache-Control: no-cache' --head | grep -i access-control)


if [ $? -eq 0 ]
then
  color_msg $green "$url $origin"
else
  color_msg $red "$url does not support CORS"
  color_msg $blue "you might want to visit https://enable-cors.org/ to find out how to enable CORS"
fi

การเพิ่มส่วนหัว Origin จะทำให้ดีขึ้น e กรัม -H 'origin: mydomain.xyz '
Bas

3

ดูเหมือนว่างานนี้:

curl -I http://example.com

ค้นหาAccess-Control-Allow-Origin: *ในส่วนหัวที่ส่งคืน


3
จำไว้ว่า*ไม่สามารถใช้งานได้หากจำเป็นต้องแสดงข้อมูลรับรองเช่นคุกกี้ด้วยคำขอ API ในกรณีที่ FQDN เป็นสิ่งจำเป็นในการตอบสนองเช่นเดียวกับAccess-Control-Allow-Origin Access-Control-Allow-Credentials: trueคำขอที่มีการรับรองแม้ว่าจะไม่ได้ระบุว่าเป็นข้อกำหนดโดย OP ดังนั้น*ทำงานได้กับคำขอที่ไม่ได้รับการตรวจสอบสิทธิ์ใด ๆ
GameSalutes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.