Tại sao cuộn tròn và wget dẫn đến 403 bị cấm?


57

Tôi cố gắng để tải về một tập tin với wgetcurlvà bị bác bỏ với một lỗi 403 (bị cấm).

Tôi có thể xem tệp bằng trình duyệt web trên cùng một máy.

Tôi thử lại với tác nhân người dùng của trình duyệt, được lấy bởi http://www.whatsmyuseragent.com . Tôi làm việc này:

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://...

nhưng nó vẫn bị cấm. Những lý do nào khác có thể có cho 403, và những cách nào tôi có thể thay đổi wgetcurlcác lệnh để khắc phục chúng?

(đây không phải là về việc có thể lấy tệp - Tôi biết tôi chỉ có thể lưu nó từ trình duyệt của mình; nó hiểu về lý do tại sao các công cụ dòng lệnh hoạt động khác nhau)

cập nhật

Cảm ơn tất cả các câu trả lời tuyệt vời cho câu hỏi này. Vấn đề cụ thể tôi gặp phải là máy chủ đang kiểm tra người giới thiệu. Bằng cách thêm phần này vào dòng lệnh tôi có thể lấy tệp bằng curlwget.

Máy chủ đã kiểm tra người giới thiệu bị trả về thông qua 302 đến một vị trí khác hoàn toàn không thực hiện kiểm tra, do đó, một curlhoặc wgettrang web đó hoạt động sạch sẽ.

Nếu có ai quan tâm, điều này đã về vì tôi đang đọc này trang để tìm hiểu về CSS nhúng và đang cố gắng nhìn vào css của trang web cho một ví dụ. URL thực tế tôi gặp rắc rối là cái nàycurlcuối cùng tôi đã là

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

và wget là

 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

Rất thú vị.


7
Các trang kiểm tra người giới thiệu thực sự gây phiền nhiễu. Tiêu đề được cho là tùy chọn và được sử dụng để thu thập số liệu thống kê.
zaadeh

Cách dễ nhất tôi tìm thấy là chuyển đổi nó thành tệp zip và sử dụng nó theo cách đó.
piniyini 20/03/2015

Câu trả lời:


40

Một yêu cầu HTTP có thể chứa nhiều tiêu đề không được đặt bởi curl hoặc wget. Ví dụ:

  • Cookie: đây là lý do rất có thể khiến một yêu cầu sẽ bị từ chối, tôi đã thấy điều này xảy ra trên các trang web tải xuống. Đưa ra một cookie key=val, bạn có thể đặt nó với tùy chọn -b key=val(hoặc --cookie key=val) cho curl.
  • Người giới thiệu (sic): khi nhấp vào một liên kết trên trang web, hầu hết các trình duyệt có xu hướng gửi trang hiện tại dưới dạng tham chiếu. Không nên dựa vào nó, nhưng ngay cả eBay cũng không thể thiết lập lại mật khẩu khi tiêu đề này vắng mặt. Vì vậy, có, nó có thể xảy ra. Các curltùy chọn cho điều này là -e URL--referer URL.
  • Ủy quyền: điều này hiện đang trở nên ít phổ biến hơn do giao diện người dùng không kiểm soát được của hộp thoại tên người dùng / mật khẩu, nhưng vẫn có thể. Nó có thể được đặt trong curlvới -u user:password(hoặc --user user:password) tùy chọn.
  • Tác nhân người dùng: một số yêu cầu sẽ mang lại phản hồi khác nhau tùy thuộc vào Tác nhân người dùng. Điều này có thể được sử dụng theo cách tốt (cung cấp tải xuống thực sự chứ không phải là danh sách các gương) hoặc theo cách xấu (từ chối các tác nhân người dùng không bắt đầu Mozillahoặc chứa Wgethoặc curl).

Thông thường bạn có thể sử dụng các công cụ dành cho nhà phát triển của trình duyệt của mình (Firefox và Chrome hỗ trợ điều này) để đọc các tiêu đề được gửi bởi trình duyệt của bạn. Nếu kết nối không được mã hóa (nghĩa là không sử dụng HTTPS), thì bạn cũng có thể sử dụng một trình thám thính gói như Wireshark cho mục đích này.

Bên cạnh những tiêu đề này, các trang web cũng có thể kích hoạt một số hành động đằng sau hậu trường thay đổi trạng thái. Ví dụ: khi mở một trang, có thể yêu cầu được thực hiện trên nền để chuẩn bị liên kết tải xuống. Hoặc một chuyển hướng xảy ra trên trang. Các hành động này thường sử dụng Javascript, nhưng cũng có thể có một khung ẩn để tạo điều kiện thuận lợi cho các hành động này.

Nếu bạn đang tìm kiếm một phương pháp để dễ dàng tìm nạp các tệp từ một trang tải xuống, hãy xem qua việc cày thuê, kèm theo lưỡi cày .


Một khả năng thực sự sai lầm khác là máy chủ vì một số lý do đã được cấu hình để trả về 403 thay vì 200 khi thành công.
kasperd

1
Điều này đã cho tôi manh mối tôi cần. Sau khi thử cookie, tôi thấy người giới thiệu là vấn đề (bây giờ, nếu chỉ có thể viết đúng chính tả !!!)
starfry

2
Nếu nó vẫn thất bại trong wgetviệc thử thêm --auth-no-challenge. Hoạt động như ma thuật.
Jonathan

13

Chỉ muốn thêm vào các câu trả lời ở trên mà bạn có thể sử dụng tính năng "Sao chép dưới dạng cURL" có trong các công cụ dành cho nhà phát triển Chrome (kể từ v26.0) và Fireorms (kể từ v1.12 ). Bạn có thể truy cập tính năng này nhấp chuột phải vào hàng yêu cầu trong tab Mạng.


Điều này đã giúp rất nhiều, đặc biệt là các công cụ trong Chrome. Khi tôi thử trong firefox, tiêu đề yêu cầu sau 302 là tất cả những gì tôi có thể thấy. Trong Chromium tôi có thể thấy cả hai và điều này đã cho tôi thông tin để giải quyết vấn đề.
starfry

1
@starfry Bạn cần đánh dấu Enable persistent logsvào tab cài đặt của các công cụ dev của Firefox để ngăn nó xóa nhật ký mạng khi chuyển hướng. Chrome có một tùy chọn tương tự. Ngẫu nhiên, "Sao chép dưới dạng cURL" đã có trong Firefox Nightly / Aurora / Beta được một thời gian và sẽ được phát hành chính tiếp theo (31.0).
Bob

9

Đã thử tất cả những điều trên tuy nhiên không có may mắn; đã sử dụng công cụ trình duyệt dev để lấy chuỗi tác nhân người dùng, sau khi tôi thêm vào, thành công:

--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

Tùy thuộc vào những gì bạn yêu cầu, nó có thể là một cookie. Với Firefox, bạn có thể nhấp chuột phải khi bạn vào trang đang đề cập, "Xem thông tin trang". Chọn biểu tượng "Bảo mật", rồi bấm vào nút "Xem Cookies".

Để đánh đố cookie, trình cắm "Live HTTP Headers" của Firefox là điều cần thiết. Bạn có thể xem những cookie nào được đặt và những cookie nào được gửi trở lại máy chủ web.

wgetcó thể hoạt động với cookie, nhưng nó hoàn toàn gây phẫn nộ, vì nó không đưa ra gợi ý rằng nó không gửi cookie. Đặt cược tốt nhất của bạn là xóa tất cả các cookie liên quan khỏi trình duyệt của bạn và trải qua bất kỳ trình tự đăng nhập hoặc xem trang nào ban đầu. Xem "Tiêu đề HTTP trực tiếp" để biết cookie và xem có bất kỳ tham số POST hoặc GET nào không. Thực hiện bước đăng nhập đầu tiên bằng wgetcách sử dụng tùy chọn "--keep-session-cookies" và "--save-cookies". Điều đó sẽ cung cấp cho bạn một tệp cookie mà bạn có thể xem bằng trình soạn thảo văn bản. Sử dụng wget --load-cookiesvới tệp cookie cho các bước tiếp theo.


1
Tôi đã kiểm tra mà không có cookie trong Firefox bằng cách mở một cửa sổ duyệt web riêng tư và, như mong đợi, tôi đã gặp lỗi 403. Thật thú vị khi bạn không nhận được lỗi trong một tab mới. Trong Chromium, một tab mới trả về 403.
starfry

1
Ngẫu nhiên, bạn có thể sử dụng tab mạng của các công cụ phát triển của Firefox để kiểm tra cookie đã gửi và nhận mà không cần bất kỳ tiện ích bổ sung nào. Ditto cho Chrome / Chromium.
Bob

@bob - vâng tôi thấy vậy. Phải mất vài phút vì nó không phải là một cái gì đó. Bây giờ Firebird đã sao chép là CURL nhưng thật tuyệt khi thấy nó cũng là công cụ gốc.
starfry

1

Một lý do khác điều này có thể xảy ra là nếu trang web yêu cầu SSL. Trình duyệt của bạn sẽ tự động chuyển tiếp từ HTTP sang HTTPS nhưng curl và wget thì không. Vì vậy, hãy thử yêu cầu với HTTPS thay vì HTTP.


3
Điều này sẽ kết thúc trong lỗi 301 hoặc 302, Chuyển hướng, nếu tôi đúng.
Jakuje
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.