curl ve wget neden 403 forbidden ile sonuçlanır?

Bir dosyayı wget ve curl ile indirmeye çalışıyorum ve 403 hatası (yasak) ile reddediliyor.

Dosyayı aynı makinedeki web tarayıcısını kullanarak görüntüleyebiliyorum.

Tarayıcımın http://www.whatsmyuseragent.com tarafından elde edilen kullanıcı aracısı ile tekrar deniyorum. Bunu yapıyorum:

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

ve

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

ama hala yasak. 403'ün başka ne gibi nedenleri olabilir ve bunları aşmak için wget ve curl komutlarını ne şekilde değiştirebilirim?

(bu dosyayı alabilmekle ilgili değil - tarayıcımdan kaydedebileceğimi biliyorum; komut satırı araçlarının neden farklı çalıştığını anlamakla ilgili)

güncelleme

Bu soruya verilen tüm mükemmel cevaplar için teşekkürler. Karşılaştığım özel sorun, sunucunun yönlendiriciyi kontrol etmesiydi. Bunu komut satırına ekleyerek curl ve wget kullanarak dosyayı alabildim.

Yönlendiriciyi kontrol eden sunucu, hiçbir kontrol yapmayan başka bir konuma bir 302 ile sıçradı, bu nedenle bu sitenin bir curl veya wgeti temiz bir şekilde çalıştı.

Eğer ilgilenen varsa, bu durum gömülü CSS hakkında bilgi edinmek için this sayfasını okurken ve örnek olarak sitenin css'sine bakmaya çalışırken ortaya çıktı. Sorun yaşadığım asıl URL this idi ve sonuçta elde ettiğim curl şu şekildeydi

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

ve wget ise

 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

Çok ilginç.

Çözüm

Bir HTTP isteği curl veya wget tarafından ayarlanmayan daha fazla başlık içerebilir. Örneğin:

  • Çerez: bir isteğin reddedilmesinin en olası nedeni budur, bunun indirme sitelerinde gerçekleştiğini gördüm. Bir çerez key=val verildiğinde, bunu curl için -b key=val (veya --cookie key=val) seçeneği ile ayarlayabilirsiniz.
  • Referer (sic): bir web sayfasındaki bir bağlantıya tıklandığında, çoğu tarayıcı geçerli sayfayı referrer olarak gönderme eğilimindedir. Buna güvenilmemelidir, ancak eBay bile bu başlık olmadığında bir şifreyi sıfırlayamadı. Yani evet, bu olabilir. Bunun için curl seçeneği -e URL ve --referer URL şeklindedir.
  • Yetkilendirme: kullanıcı adı/parola iletişim kutusunun kontrol edilemeyen kullanıcı arayüzü nedeniyle bu artık daha az popüler hale geliyor, ancak hala mümkün. Bu curl içinde -u user:password (veya --user user:password) seçeneği ile ayarlanabilir.
  • User-Agent: bazı istekler Kullanıcı Aracısına bağlı olarak farklı yanıtlar verecektir. Bu iyi bir şekilde (bir ayna listesi yerine gerçek indirme sağlar) veya kötü bir şekilde (Mozilla ile başlamayan veya Wget veya curl içeren kullanıcı aracılarını reddeder) kullanılabilir.

Tarayıcınız tarafından gönderilen başlıkları okumak için normalde tarayıcınızın Geliştirici araçlarını kullanabilirsiniz (Firefox ve Chrome bunu destekler). Bağlantı şifrelenmemişse (yani HTTPS kullanılmıyorsa), bu amaçla Wireshark gibi bir paket dinleyicisi de kullanabilirsiniz.

Bu başlıkların yanı sıra, web siteleri perde arkasında durumu değiştiren bazı eylemleri de tetikleyebilir. Örneğin, bir sayfa açılırken, indirme bağlantısını hazırlamak için arka planda bir istek gerçekleştirilmesi mümkündür. Ya da sayfada bir yönlendirme gerçekleşir. Bu eylemler genellikle Javascript kullanır, ancak bu eylemleri kolaylaştırmak için gizli bir çerçeve de olabilir.

Bir indirme sitesinden dosyaları kolayca almak için bir yöntem arıyorsanız, plowshare ile birlikte gelen plowdown'a bir göz atın.

Yorumlar (3)

Yukarıdaki yanıtlara Chrome geliştirici araçlarında (v26.0'dan beri) ve Firebug'da (v1.12'den beri) bulunan "Copy as cURL" özelliğini kullanabileceğinizi eklemek istiyorum. Bu özelliğe Ağ sekmesindeki istek satırına sağ tıklayarak erişebilirsiniz.

Yorumlar (2)

Ne istediğinize bağlı olarak, bu bir çerez olabilir. Firefox ile, söz konusu sayfadayken sağ tıklayıp "Sayfa Bilgilerini Görüntüle" yapabilirsiniz. Güvenlik" simgesini seçin ve ardından "Çerezleri Görüntüle" düğmesine tıklayın.

Çerezleri çözmek için Firefox "Live HTTP Headers" eklentisi çok önemlidir. Hangi çerezlerin ayarlandığını ve web sunucusuna hangi çerezlerin geri gönderildiğini görebilirsiniz.

'wget' çerezlerle çalışabilir, ancak çerez göndermediğine dair bir ipucu vermediği için tamamen sinir bozucudur. Yapabileceğiniz en iyi şey, ilgili tüm çerezleri tarayıcınızdan kaldırmak ve ilk oturum açma veya sayfa görüntüleme sırası ne olursa olsun devam etmektir. Çerezler ve POST ya da GET parametreleri için "Live HTTP Headers" bölümüne bakın. İlk giriş adımını "--keep-session-cookies" ve "--save-cookies" seçeneklerini kullanarak wget ile yapın. Bu size bir metin editörü ile bakabileceğiniz bir çerez dosyası verecektir. Sonraki adımlar için çerez dosyasıyla birlikte wget --load-cookies kullanın.

Yorumlar (3)