web-dev-qa-db-fra.com

pourquoi le curl et le wget entraîneraient-ils un 403 interdit?

J'essaie de télécharger un fichier avec wget et curl et il est rejeté avec une erreur 403 (interdit).

Je peux afficher le fichier à l'aide du navigateur Web sur la même machine.

J'essaie à nouveau avec l'agent utilisateur de mon navigateur, obtenu par http://www.whatsmyuseragent.com . Je fais ça:

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

et

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

mais c'est toujours interdit. Quelles autres raisons peut-il y avoir pour le 403, et comment puis-je modifier les commandes wget et curl pour les surmonter?

(il ne s'agit pas de pouvoir obtenir le fichier - je sais que je peux simplement l'enregistrer à partir de mon navigateur; il s'agit de comprendre pourquoi les outils de ligne de commande fonctionnent différemment)

mise à jour

Merci à toutes les excellentes réponses données à cette question. Le problème spécifique que j'avais rencontré était que le serveur vérifiait le référent. En ajoutant ceci à la ligne de commande, j'ai pu obtenir le fichier en utilisant curl et wget.

Le serveur qui a vérifié le référent a rebondi via un 302 vers un autre emplacement qui n'a effectué aucune vérification, donc un curl ou wget de ce site a fonctionné correctement.

Si quelqu'un est intéressé, cela est dû au fait que je lisais this page pour en savoir plus sur le CSS intégré et essayais de regarder le CSS du site pour un exemple. L'URL réelle avec laquelle je rencontrais des problèmes était this et le curl avec lequel je me suis retrouvé est

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

et le wget est

 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

Très intéressant.

59
starfry

Une requête HTTP peut contenir plus d'en-têtes qui ne sont pas définis par curl ou wget. Par exemple:

  • Cookie: c'est la raison la plus probable pour laquelle une demande serait rejetée, j'ai vu cela se produire sur les sites de téléchargement. Étant donné un cookie key=val, vous pouvez le définir avec le -b key=val (ou --cookie key=val) option pour curl.
  • Référent (sic): lorsque vous cliquez sur un lien sur une page Web, la plupart des navigateurs ont tendance à envoyer la page actuelle comme référent. Il ne faut pas s'y fier, mais même eBay n'a pas réussi à réinitialiser un mot de passe lorsque cet en-tête était absent. Alors oui, cela peut arriver. L'option curl pour cela est -e URL et --referer URL.
  • Autorisation: cela devient moins populaire maintenant en raison de l'interface utilisateur incontrôlable de la boîte de dialogue nom d'utilisateur/mot de passe, mais c'est toujours possible. Il peut être défini dans curl avec le -u user:password (ou --user user:password).
  • User-Agent: certaines demandes produiront des réponses différentes selon l'agent utilisateur. Cela peut être utilisé dans le bon sens (en fournissant le téléchargement réel plutôt qu'une liste de miroirs) ou dans le mauvais sens (rejeter les agents utilisateurs qui ne commencent pas par Mozilla, ou contiennent Wget ou curl).

Vous pouvez normalement utiliser les outils de développement de votre navigateur (Firefox et Chrome supporte cela) pour lire les en-têtes envoyés par votre navigateur. Si la connexion n'est pas cryptée (c'est-à-dire, n'utilise pas HTTPS), vous pouvez également utiliser un renifleur de paquets tel que Wireshark à cet effet.

Outre ces en-têtes, les sites Web peuvent également déclencher certaines actions en arrière-plan qui changent d'état. Par exemple, lors de l'ouverture d'une page, il est possible qu'une demande soit effectuée en arrière-plan pour préparer le lien de téléchargement. Ou une redirection se produit sur la page. Ces actions utilisent généralement Javascript, mais il peut également y avoir un cadre caché pour faciliter ces actions.

Si vous cherchez une méthode pour récupérer facilement des fichiers à partir d'un site de téléchargement, jetez un œil à labour, inclus avec plowshare .

40
Lekensteyn

Je veux juste ajouter aux réponses ci-dessus que vous pouvez utiliser la fonctionnalité "Copier en tant que cURL" présente dans Chrome outils de développement (depuis v26.0) et Firebug (depuis v1.12 ). Vous pouvez accéder à cette fonctionnalité en cliquant avec le bouton droit sur la ligne de demande dans l'onglet Réseau.

13
solde9

J'ai essayé tout ce qui précède mais pas de chance; utilisé l'outil de navigateur de développement pour obtenir la chaîne de l'agent utilisateur, une fois que j'ai ajouté ce qui suit, succès:

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

Selon ce que vous demandez, il peut s'agir d'un cookie. Avec Firefox, vous pouvez faire un clic droit lorsque vous êtes sur la page en question, "Afficher les informations sur la page". Choisissez l'icône "Sécurité", puis cliquez sur le bouton "Afficher les cookies".

Pour dérouter les cookies, le plug-in Firefox "Live HTTP Headers" est essentiel. Vous pouvez voir quels cookies sont configurés et quels cookies sont renvoyés au serveur Web.

wget peut fonctionner avec les cookies, mais c'est totalement exaspérant, car il ne donne aucune indication qu'il n'a pas envoyé de cookies. Votre meilleur pari est de supprimer tous les cookies associés de votre navigateur et de suivre la séquence de connexion initiale ou de visualisation de page nécessaire. Regardez "Live HTTP Headers" pour les cookies et pour tous les paramètres POST ou GET. Effectuez la première étape de connexion avec wget en utilisant "--keep-session-cookies" et Options "--save-cookies". Cela vous donnera un fichier cookie que vous pouvez consulter avec un éditeur de texte. Utilisez wget --load-cookies avec le fichier cookie pour les étapes suivantes.

5
Bruce Ediger

Cela peut également se produire si le site nécessite SSL. Votre navigateur transférera automatiquement de HTTP vers HTTPS, mais curl et wget ne le feront pas. Essayez donc la demande avec HTTPS au lieu de HTTP.

1
Richard