mengapa ikal dan ikal menghasilkan 403 terlarang?

57

Saya mencoba mengunduh file dengan wgetdan curlditolak dengan kesalahan 403 (dilarang).

Saya dapat melihat file menggunakan browser web pada mesin yang sama.

Saya coba lagi dengan agen pengguna browser saya, yang diperoleh oleh http://www.whatsmyuseragent.com . Saya melakukan ini:

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

dan

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

tapi itu masih dilarang. Apa alasan lain yang mungkin ada untuk 403, dan cara apa yang bisa saya ubah wgetdan curlperintah untuk mengatasinya?

(Ini bukan tentang bisa mendapatkan file - saya tahu saya bisa menyimpannya dari browser saya; ini tentang memahami mengapa alat baris perintah bekerja secara berbeda)

memperbarui

Terima kasih atas semua jawaban bagus yang diberikan untuk pertanyaan ini. Masalah khusus yang saya temui adalah server sedang memeriksa pengarah. Dengan menambahkan ini ke baris perintah saya bisa mendapatkan file menggunakan curldan wget.

Server yang diperiksa pengarah melambung melalui 302 ke lokasi lain yang dilakukan tidak ada pemeriksaan sama sekali, sehingga curlatau wgetsitus yang bekerja bersih.

Jika ada yang tertarik, ini terjadi karena saya membaca halaman ini untuk mempelajari tentang CSS yang disematkan dan mencoba melihat css situs sebagai contoh. URL aktual yang saya dapatkan bermasalah adalah ini dan curlakhirnya saya adalah

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

dan wget adalah

 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

Sangat menarik.

starfry
sumber
7
Halaman yang memeriksa referer sangat mengganggu. Header seharusnya opsional dan digunakan untuk mengumpulkan statistik.
zaadeh
Hal termudah yang saya temukan adalah mengonversinya menjadi file zip dan menggunakannya dengan cara itu.
piniyini

Jawaban:

40

Permintaan HTTP mungkin berisi lebih banyak tajuk yang tidak disetel oleh curl atau wget. Sebagai contoh:

  • Cookie: ini kemungkinan alasan mengapa permintaan ditolak, saya telah melihat ini terjadi di situs unduhan. Diberi cookie key=val, Anda dapat mengaturnya dengan opsi -b key=val(atau --cookie key=val) untuk curl.
  • Referer (sic): ketika mengklik tautan pada halaman web, sebagian besar browser cenderung mengirim halaman saat ini sebagai referer. Seharusnya tidak diandalkan, tetapi bahkan eBay gagal mengatur ulang kata sandi ketika header ini tidak ada. Jadi ya, itu mungkin terjadi. The curlpilihan untuk ini -e URLdan --referer URL.
  • Otorisasi: ini menjadi kurang populer sekarang karena UI yang tidak terkendali dari dialog nama pengguna / kata sandi, tetapi masih mungkin. Itu dapat diatur curldengan opsi -u user:password(atau --user user:password).
  • Agen-Pengguna: beberapa permintaan akan menghasilkan respons yang berbeda tergantung pada Agen Pengguna. Ini dapat digunakan dengan cara yang baik (menyediakan unduhan nyata daripada daftar mirror) atau dengan cara yang buruk (menolak agen pengguna yang tidak memulai Mozilla, atau mengandung Wgetatau curl).

Anda biasanya dapat menggunakan alat Pengembang browser Anda (Firefox dan Chrome mendukung ini) untuk membaca header yang dikirim oleh browser Anda. Jika koneksi tidak dienkripsi (yaitu, tidak menggunakan HTTPS), maka Anda juga dapat menggunakan sniffer paket seperti Wireshark untuk tujuan ini.

Selain tajuk ini, situs web juga dapat memicu beberapa tindakan di belakang layar yang mengubah status. Misalnya, saat membuka halaman, ada kemungkinan permintaan dilakukan di latar belakang untuk menyiapkan tautan unduhan. Atau pengalihan terjadi pada halaman. Tindakan ini biasanya menggunakan Javascript, tetapi mungkin juga ada bingkai tersembunyi untuk memfasilitasi tindakan ini.

Jika Anda mencari metode untuk mengambil file dengan mudah dari situs unduhan, lihat bajak, termasuk dengan mata bajak .

Lekensteyn
sumber
Kemungkinan lain yang benar-benar buruk adalah server karena alasan tertentu dikonfigurasi untuk mengembalikan 403 alih-alih 200 jika berhasil.
kasperd
1
Ini memberi saya petunjuk yang saya butuhkan. Setelah mencoba cookies, saya menemukan referer menjadi masalah (sekarang, kalau saja itu bisa dieja dengan benar !!!)
starfry
2
Jika masih gagal dalam wgetmencoba menambahkan --auth-no-challenge. Bekerja seperti sulap.
Jonathan
13

Hanya ingin menambahkan jawaban di atas bahwa Anda dapat menggunakan fitur "Salin sebagai cURL" yang ada di alat pengembang Chrome (sejak v26.0) dan Firebug (sejak v1.12 ). Anda dapat mengakses fitur ini dengan mengklik kanan baris permintaan di tab Jaringan.

dijual9
sumber
Ini sangat membantu, terutama alat-alat di Chrome. Ketika saya mencoba di firefox, header permintaan setelah 302 adalah yang bisa saya lihat. Di Chromium saya bisa melihat keduanya dan ini memberi saya info untuk menyelesaikan masalah.
starfry
1
@ starfry Anda perlu mencentang Enable persistent logspada tab pengaturan alat dev Firefox untuk mencegahnya menghapus log jaringan pada pengalihan. Chrome memiliki opsi serupa. Kebetulan, "Salin sebagai cURL" telah ada di Firefox Nightly / Aurora / Beta untuk sementara waktu sekarang, dan akan dirilis besar-besaran berikutnya (31.0).
Bob
9

Mencoba semua hal di atas namun tidak berhasil; menggunakan alat dev browser untuk mendapatkan string agen-pengguna, setelah saya menambahkan yang berikut, sukses:

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

Tergantung pada apa yang Anda minta, itu bisa berupa cookie. Dengan Firefox, Anda dapat melakukan klik kanan saat Anda berada di halaman yang dimaksud, "Lihat Info Halaman". Pilih ikon "Keamanan", dan kemudian klik tombol "Lihat Cookie".

Untuk membingungkan cookie, plug-in "Live HTTP Headers" Firefox sangat penting. Anda dapat melihat cookie apa yang diatur, dan cookie apa yang dikirim kembali ke server web.

wgetdapat bekerja dengan cookie, tetapi itu benar-benar menyebalkan, karena tidak memberikan petunjuk bahwa itu tidak mengirim cookie. Taruhan terbaik Anda adalah untuk menghapus semua cookie terkait dari browser Anda, dan pergi melalui login awal atau urutan tampilan halaman yang diperlukan. Lihatlah "Header HTTP Langsung" untuk cookie, dan untuk setiap parameter POST atau GET. Lakukan langkah login pertama dengan wgetmenggunakan opsi "--keep-session-cookies" dan "--save-cookies". Itu akan memberi Anda file cookie yang dapat Anda lihat dengan editor teks. Gunakan wget --load-cookiesdengan file cookie untuk langkah selanjutnya.

Bruce Ediger
sumber
1
Saya menguji tanpa cookie di Firefox dengan membuka jendela penelusuran pribadi dan, seperti yang diharapkan, saya mendapatkan kesalahan 403. Menarik bahwa Anda tidak mendapatkan kesalahan di tab baru. Di Chromium, tab baru mengembalikan 403.
starfry
1
Secara kebetulan, Anda dapat menggunakan tab jaringan alat dev Firefox untuk memeriksa cookie yang dikirim dan diterima tanpa add-on apa pun. Ditto untuk Chrome / Chromium.
Bob
@ Bob - ya saya menemukan itu. Saya butuh beberapa menit karena itu bukan sesuatu. Firebug memiliki Salin sebagai CURL sekarang tetapi akan menyenangkan untuk melihatnya sebagai alat asli juga.
starfry
1

Alasan lain ini bisa terjadi adalah jika situs memerlukan SSL. Browser Anda akan secara otomatis meneruskan dari HTTP ke HTTPS tetapi curl dan wget tidak akan. Jadi cobalah permintaan dengan HTTPS alih-alih HTTP.

Richard
sumber
3
Ini akan berakhir dengan kesalahan 301 atau 302, Redirect, jika saya benar.
Jakuje