чому б завивання та 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команди, щоб їх подолати?

(справа не в тому, щоб отримати файл - я знаю, що можу просто зберегти його з браузера; це зрозуміти, чому інструменти командного рядка працюють по-іншому)

оновлення

Дякую всім відмінним відповідям на це запитання. Конкретна проблема, з якою я стикався, полягала в тому, що сервер перевіряв реферала. Додавши це до командного рядка, я міг отримати файл за допомогою curlі wget.

Сервер, який перевіряв реферала, відскакував через 302 в інше місце, яке взагалі не виконувало перевірок, тому той curlчи wgetінший сайт працював чисто.

Якщо хтось зацікавився, це сталося тому, що я читав цю сторінку, щоб дізнатися про вбудований CSS і намагався переглянути приклад 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. Наприклад:

  • Cookie: це найвірогідніша причина, чому запит буде відхилено. Я бачив, що це відбувається на сайтах завантажень. Давши файл cookie key=val, ви можете встановити його за допомогою параметра -b key=val(або --cookie key=val) для curl.
  • Referer (sic): при натисканні на посилання на веб-сторінці більшість браузерів, як правило, надсилає поточну сторінку в якості реферала. На це не слід покладатися, але навіть eBay не вдалося скинути пароль, коли цей заголовок відсутній. Так що так, це може статися. curlВаріантом є -e URLі --referer URL.
  • Авторизація: тепер це стає менш популярним через неконтрольований інтерфейс користувача діалогового вікна ім'я користувача / пароля, але це все ще можливо. Його можна встановити за curlдопомогою параметра -u user:password(або --user user:password).
  • Користувач-агент: деякі запити дають різні відповіді залежно від Агента користувача. Це можна використовувати в хорошому способі (надаючи реальне завантаження, а не список дзеркал) або погано (відхилити користувацькі агенти, які не починаються з Mozilla, містять Wgetабо містять curl).

Зазвичай ви можете використовувати інструменти для розробників свого веб-переглядача (Firefox та Chrome підтримують це), щоб прочитати заголовки, надіслані вашим браузером. Якщо з'єднання не шифрується (тобто не використовується HTTPS), ви також можете використовувати для цієї мети сніффер для пакетів, наприклад Wireshark.

Крім цих заголовків, веб-сайти можуть також викликати деякі дії за кадром, які змінюють стан. Наприклад, відкриваючи сторінку, можливо, на задньому плані виконується запит для підготовки посилання для завантаження. Або перенаправлення відбувається на сторінці. Ці дії, як правило, використовують Javascript, але також може бути прихований кадр для полегшення цих дій.

Якщо ви шукаєте метод легко отримати файли з сайту завантаження, подивіться на plowdown, включений з лемешем .


Ще одна справді викривлена ​​можливість полягала б у тому, що сервер з якоїсь причини був налаштований повертати 403 замість 200 на успіх.
kasperd

1
Це дало мені підказку, яка мені потрібна. Спробувавши файли cookie, я виявив проблему з перенаправленням (тепер, якби тільки це було написано належним чином !!!)
starfry

2
Якщо він ще не вдається в wgetспробі додавання --auth-no-challenge. Працює як магія.
Джонатан

13

Просто хочемо додати до вищезазначених відповідей, що ви можете використовувати функцію "Скопіювати як cURL", наявну в інструментах для розробників Chrome (з v26.0) та Firebug (з v1.12 ). Ви можете отримати доступ до цієї функції правою кнопкою миші на рядку запиту на вкладці Мережа.


Це дуже допомогло, особливо інструменти в Chrome. Коли я спробував у firefox, заголовок запиту після 302 було все, що я міг бачити. У Chromium я бачив і те, і інше, і це дало мені інформацію для вирішення проблеми.
starfry

1
@starfry Вам потрібно поставити галочку Enable persistent logsна вкладці налаштувань інструментів розробки Firefox, щоб запобігти очищенню мережевих журналів при переадресації. У Chrome є аналогічний варіант. До речі, "Copy as cURL" вже деякий час знаходиться у Firefox Nightly / Aurora / Beta, і він повинен бути наступним головним випуском (31,0).
Боб

9

Випробував усе вищесказане, проте не пощастило; використовував інструмент браузера розробників, щоб отримати рядок-агент користувача, як тільки я додав наступне, успіх:

--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 ви можете робити клацання правою кнопкою миші, коли ви перебуваєте на відповідній сторінці "Переглянути інформацію про сторінку". Виберіть піктограму "Захист" і натисніть кнопку "Переглянути файли cookie".

Для здивування файлів cookie важливий плагін Firefox "Live HTTP Headers". Ви можете бачити, які файли cookie встановлюються та які файли cookie надсилаються на веб-сервер.

wgetможе працювати з файлами cookie, але це абсолютно неприємно, оскільки це не дає намного, що він не надсилає файли cookie. Ваша найкраща ставка - видалити всі пов’язані файли cookie зі свого веб-переглядача та пройти будь-яку послідовність початкового входу чи перегляду сторінок. Перегляньте "Заголовки HTTP Live" щодо файлів cookie та будь-яких параметрів POST або GET. Зробіть перший крок входу за wgetдопомогою параметрів "--keep-session-cookies" та "--save-cookies". Це дасть вам файл файлів cookie, який ви можете переглянути в текстовому редакторі. Скористайтеся wget --load-cookiesразом із файлом cookie для наступних кроків.


1
Я перевірив без файлів cookie у Firefox, відкривши приватне вікно перегляду, і, як очікувалося, отримав помилку 403. Цікаво, що ви не отримаєте помилку на новій вкладці. У Chromium нова вкладка повертає 403.
starfry

1
До речі, ви можете використовувати вкладку мережі інструментів розробки Firefox для перевірки відправлених та отриманих файлів cookie без будь-яких доповнень. Дитто для Chrome / Chromium.
Боб

@bob - так, я знайшов це. Мені знадобилося кілька хвилин, оскільки це було не те, що. Firebug має Copy як CURL зараз, але було б непогано побачити і його рідними інструментами.
starfry

1

Ще одна причина, що може статися, це якщо сайт вимагає SSL. Ваш веб-переглядач автоматично пересилатиме з HTTP на HTTPS, але згортання та wget не будуть. Тому спробуйте запит із HTTPS замість HTTP.


3
Це закінчиться помилкою 301 або 302, Перенаправлення, якщо я маю рацію.
Jakuje
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.