ทำไมจะขดและ wget ส่งผลให้เป็นสิ่งต้องห้าม 403?


57

ฉันพยายามที่จะดาวน์โหลดไฟล์ที่มีwgetและcurlและมันจะถูกปฏิเสธด้วยข้อผิดพลาด 403 (ต้องห้าม)

ฉันสามารถดูไฟล์โดยใช้เว็บเบราว์เซอร์ในเครื่องเดียวกัน

ผมลองอีกครั้งกับตัวแทนของผู้ใช้เบราว์เซอร์ของฉันได้โดยhttp://www.whatsmyuseragent.com ฉันทำนี่:

wget -U 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...

และ

curl -A 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' http://...

แต่มันก็ยังเป็นสิ่งต้องห้าม มีเหตุผลอื่นอีกอีกบ้างสำหรับ 403 และฉันจะแก้ไขwgetและcurlคำสั่งต่าง ๆ เพื่อเอาชนะพวกเขาได้อย่างไร

(นี่ไม่เกี่ยวกับความสามารถในการรับไฟล์ - ฉันรู้ว่าฉันสามารถบันทึกได้จากเบราว์เซอร์ของฉัน แต่มันเกี่ยวกับการทำความเข้าใจว่าทำไมเครื่องมือบรรทัดคำสั่งทำงานแตกต่างกัน)

ปรับปรุง

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

เซิร์ฟเวอร์ที่ตรวจสอบผู้อ้างอิงได้เด้งผ่าน 302 ไปยังอีกที่หนึ่งซึ่งไม่ได้ทำการตรวจสอบเลยดังนั้นเว็บไซต์หนึ่งแห่งcurlหรือwgetไซต์ดังกล่าวทำงานได้อย่างสมบูรณ์

หากใครสนใจเรื่องนี้เกิดขึ้นเพราะฉันอ่านหน้านี้เพื่อเรียนรู้เกี่ยวกับ CSS ที่ฝังตัวและพยายามดูตัวอย่างของเว็บไซต์ URL จริงที่ฉันได้รับปัญหาคือสิ่งนี้และcurlฉันก็จบลงด้วยคือ

curl -L -H 'Referer: http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css

และ wget คือ

 wget --referer='http://css-tricks.com/forums/topic/font-face-in-base64-is-cross-browser-compatible/' http://cloud.typography.com/610186/691184/css/fonts.css

น่าสนใจมาก.


7
หน้าที่ตรวจสอบผู้อ้างอิงนั้นน่ารำคาญจริงๆ ส่วนหัวควรเป็นทางเลือกและใช้สำหรับรวบรวมสถิติ
zaadeh

สิ่งที่ง่ายที่สุดที่ฉันพบคือการแปลงเป็นไฟล์ zip และใช้วิธีนั้น
piniyini

คำตอบ:


40

คำขอ HTTP อาจมีส่วนหัวเพิ่มเติมที่ไม่ได้ตั้งค่าโดย curl หรือ wget ตัวอย่างเช่น:

  • คุกกี้: นี่คือเหตุผลที่เป็นไปได้มากที่สุดว่าทำไมคำขอจะถูกปฏิเสธฉันได้เห็นสิ่งนี้เกิดขึ้นในเว็บไซต์ดาวน์โหลด ได้รับคุกกี้key=valคุณสามารถตั้งค่าด้วย-b key=val(หรือ--cookie key=val) curlเป็นทางเลือกสำหรับ
  • Referer (sic): เมื่อคลิกลิงค์บนเว็บเพจเบราว์เซอร์ส่วนใหญ่มักจะส่งหน้าปัจจุบันเป็นผู้อ้างอิง ไม่ควรเชื่อถือ แต่ eBay ก็ล้มเหลวในการรีเซ็ตรหัสผ่านเมื่อไม่มีส่วนหัวนี้ ใช่มันอาจเกิดขึ้น curlตัวเลือกสำหรับเรื่องนี้คือและ-e URL--referer URL
  • การอนุญาต: สิ่งนี้กำลังได้รับความนิยมน้อยลงในขณะนี้เนื่องจาก UI ที่ไม่สามารถควบคุมได้ของกล่องโต้ตอบชื่อผู้ใช้ / รหัสผ่าน แต่ยังคงเป็นไปได้ สามารถตั้งค่าcurlด้วยตัวเลือก-u user:password(หรือ--user user:password)
  • User-Agent: การร้องขอบางอย่างจะให้การตอบสนองที่แตกต่างกันขึ้นอยู่กับ Agent ผู้ใช้ สิ่งนี้สามารถใช้ในทางที่ดี (ให้การดาวน์โหลดจริงมากกว่ารายการมิเรอร์) หรือในทางที่ไม่ดี (ปฏิเสธตัวแทนผู้ใช้ที่ไม่ได้เริ่มต้นด้วยMozillaหรือมีWgetหรือcurl)

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

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

หากคุณกำลังมองหาวิธีการเพื่อให้ง่ายต่อการดึงไฟล์จากเว็บไซต์ดาวน์โหลดที่มีลักษณะที่ plowdown ที่มาพร้อมกับไถ


ความเป็นไปได้ที่ผิดปกติอีกอย่างหนึ่งก็คือเซิร์ฟเวอร์ด้วยเหตุผลบางอย่างถูกกำหนดค่าให้ส่งคืน 403 แทนที่จะเป็น 200 เมื่อประสบความสำเร็จ
kasperd

1
สิ่งนี้ให้เบาะแสที่ฉันต้องการ หลังจากลองใช้คุกกี้ฉันพบว่าผู้อ้างอิงเป็นปัญหา (ตอนนี้ถ้าสะกดได้อย่างถูกต้องเท่านั้น !!!)
starfry

2
ถ้ามันจะยังคงล้มเหลวในการพยายามเพิ่มwget --auth-no-challengeทำงานเหมือนเวทมนตร์
Jonathan

13

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


สิ่งนี้ช่วยได้อย่างมากโดยเฉพาะเครื่องมือใน Chrome เมื่อฉันลองใน Firefox ส่วนหัวคำขอหลังจาก 302 คือสิ่งที่ฉันเห็น ใน Chromium ฉันเห็นทั้งคู่และสิ่งนี้ทำให้ฉันมีข้อมูลในการแก้ปัญหา
starfry

1
@starfry คุณต้องทำเครื่องหมายEnable persistent logsที่แท็บการตั้งค่าของเครื่องมือ dev ของ Firefox เพื่อป้องกันการล้างบันทึกเครือข่ายในการเปลี่ยนเส้นทาง Chrome มีตัวเลือกที่คล้ายกัน อนึ่ง "Copy as cURL" อยู่ใน Firefox Nightly / Aurora / Beta ชั่วขณะหนึ่งและมีกำหนดจะเปิดตัวครั้งต่อไป (31.0)
Bob

9

พยายามทั้งหมดข้างต้น แต่ไม่มีโชค; ใช้เครื่องมือเบราว์เซอร์ dev เพื่อรับสตริงตัวแทนผู้ใช้เมื่อฉันเพิ่มรายการต่อไปนี้สำเร็จ:

--user-agent="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"

5

อาจเป็นคุกกี้ก็ได้ขึ้นอยู่กับสิ่งที่คุณขอ ด้วย Firefox คุณสามารถคลิกขวาเมื่อคุณอยู่ในหน้าคำถาม "ดูข้อมูลหน้า" เลือกไอคอน "ความปลอดภัย" จากนั้นคลิกปุ่ม "ดูคุกกี้"

สำหรับคุกกี้ที่ทำให้งงงวยปลั๊กอิน "Live HTTP Headers" ของ Firefox เป็นสิ่งจำเป็น คุณสามารถดูว่ามีการตั้งค่าคุกกี้อะไรและมีการส่งคุกกี้ใดไปยังเว็บเซิร์ฟเวอร์

wgetสามารถทำงานกับคุกกี้ได้ แต่มันทำให้โมโหอย่างสิ้นเชิงเพราะไม่ได้บอกใบ้ว่าไม่ได้ส่งคุกกี้ ทางออกที่ดีที่สุดของคุณคือการลบคุกกี้ที่เกี่ยวข้องทั้งหมดออกจากเบราว์เซอร์ของคุณและทำตามขั้นตอนการลงชื่อเข้าใช้หรือการดูหน้าเว็บที่เริ่มต้น ดูที่ "Live HTTP Headers" สำหรับคุกกี้และพารามิเตอร์ POST หรือ GET ทำขั้นตอนแรกในการเข้าสู่ระบบด้วยการwgetใช้ตัวเลือก "--keep-session-cookies" และ "--save-cookies" ที่จะให้ไฟล์คุกกี้ที่คุณสามารถดูด้วยโปรแกรมแก้ไขข้อความ ใช้wget --load-cookiesกับไฟล์คุกกี้สำหรับขั้นตอนต่อไป


1
ฉันทดสอบโดยไม่ใช้คุกกี้ใน Firefox โดยเปิดหน้าต่างการเรียกดูแบบส่วนตัวและตามที่คาดไว้ฉันได้รับข้อผิดพลาด 403 น่าสนใจที่คุณไม่ได้รับข้อผิดพลาดในแท็บใหม่ ใน Chromium แท็บใหม่จะคืนค่า 403
starfry

1
อนึ่งคุณสามารถใช้แท็บเครือข่ายของเครื่องมือ dev ของ Firefox เพื่อตรวจสอบคุกกี้ที่รับและส่งโดยไม่ต้องใช้แอดออน เช่นเดียวกันสำหรับ Chrome / Chromium
Bob

@ บ๊อบ - ใช่ฉันพบว่า ฉันใช้เวลาสองสามนาทีเพราะมันไม่ใช่อะไร Firebug มีการคัดลอกเป็น CURL ในขณะนี้ แต่มันก็ดีที่จะเห็นเครื่องมือดั้งเดิมเช่นกัน
starfry

1

อีกสาเหตุหนึ่งที่สามารถเกิดขึ้นได้คือหากไซต์ต้องการ SSL เบราว์เซอร์ของคุณจะส่งต่อจาก HTTP ไปยัง HTTPS โดยอัตโนมัติ แต่การขดและการโหลดจะไม่ ดังนั้นลองทำการร้องขอกับ HTTPS แทน HTTP


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