CURL pour accéder à une page qui nécessite une connexion depuis une autre page

125

J'ai 2 pages: xyz.com/aet xyz.com/b. Je ne peux accéder que xyz.com/bsi et seulement si je me connecte d' xyz.com/aabord. Si j'accède xyz.com/bsans passer par l'autre, j'obtiens simplement l'accès refusé (pas de redirection vers la connexion) via le navigateur. Une fois connecté xyz.com/a, je peux accéder à l'autre.

Mon problème est de faire cela en utilisant la commande curl. Je peux me connecter avec succès à l' xyz.com/aaide de curl, mais ensuite essayer xyx.com/bet j'obtiens l'accès refusé.

J'utilise ce qui suit:

curl --user user:pass https://xyz.com/a  #works ok
curl https://xyz.com/b #doesn't work

J'ai essayé d'utiliser la deuxième ligne avec et sans la partie utilisateur / mot de passe et ne fonctionne toujours pas. Les deux pages utilisent la même autorité de certification, ce n'est donc pas un problème. Aucune suggestion? Merci

ms1013
la source

Réponses:

147

Le site Web utilise probablement des cookies pour stocker vos informations de session. Quand tu cours

curl --user user:pass https://xyz.com/a  #works ok
curl https://xyz.com/b #doesn't work

curlest exécuté deux fois, en deux sessions distinctes. Ainsi, lorsque la deuxième commande s'exécute, les cookies définis par la première commande ne sont pas disponibles; c'est comme si vous vous connectiez à la page adans une session de navigateur et tentiez d'accéder à la page bdans une autre.

Ce que vous devez faire est de sauvegarder les cookies créés par la première commande:

curl --user user:pass --cookie-jar ./somefile https://xyz.com/a

puis relisez-les lors de l'exécution du second:

curl --cookie ./somefile https://xyz.com/b

Vous pouvez également essayer de télécharger les deux fichiers dans la même commande, qui, je pense, utilisera les mêmes cookies.

Escargot mécanique
la source
C'est étrange car lorsque j'essaye cela, cela ne fonctionne pas car le cookie stocké dans somefilecontient le paramètre de chemin ( /adans ce cas) et il n'est pas transmis au deuxième appel. Si je modifie le cookie dans le fichier et que je mets une barre oblique uniquement, cela fonctionne (cookie transféré au deuxième appel). Savez-vous s'il est possible d'empêcher le stockage du chemin dans le fichier cookie?
рüффп
124

Vous pouvez également vous connecter via le navigateur et obtenir la commande avec tous les en-têtes, y compris les cookies:

Ouvrez l'onglet Réseau des outils de développement, connectez-vous, accédez à la page souhaitée, utilisez "Copier en tant que cURL".

capture d'écran

utilisateur
la source
12
C'est une réponse profonde! Il ne répond pas directement à la question, car il montre comment y répondre.
bgStack15
5
c'est l'une des réponses les plus utiles. Cela vous permet vraiment d'observer et de comprendre même l'authentification en plusieurs étapes.
Pierre D
Je ne connaissais pas cette fonctionnalité enfouie dans ces outils géniaux. Super utile!
Timothy C. Quinn
52

Après quelques recherches sur Google, j'ai trouvé ceci:

curl -c cookie.txt -d "LoginName=someuser" -d "password=somepass" https://oursite/a
curl -b cookie.txt https://oursite/b

Aucune idée si cela fonctionne, mais cela pourrait vous conduire dans la bonne direction.

Joe Mills
la source
9
Cela fonctionnera si vous avez un site Web qui s'attend à ce qu'un formulaire soit soumis. Vous devrez regarder la source et trouver l'image <form> et voir quel est le nom des champs et sur quelle URL doit être publiée. Vous pouvez utiliser le débogueur de votre navigateur Web pour rechercher la demande de publication afin de voir ce qui est envoyé. C'est un peu plus facile.
stonefury
0

Ma réponse est un mod de quelques réponses antérieures de @JoeMills et @user.

  1. Obtenez une cURLcommande pour vous connecter au serveur:

    • Charger la page de connexion pour le site Web et ouvrir le volet Réseau des outils de développement
      • Dans Firefox, faites un clic droit sur la page, choisissez 'Inspecter l'élément (Q)' et cliquez sur l'onglet Réseau
    • Accédez au formulaire de connexion, entrez le nom d'utilisateur, le mot de passe et connectez-vous
    • Après vous être connecté, revenez au volet Réseau et faites défiler vers le haut pour trouver l'entrée POST. Faites un clic droit et choisissez Copier -> Copier comme CURL
    • Collez-le dans un éditeur de texte et essayez-le dans l'invite de commande pour voir si cela fonctionne
      • Il est possible que certains sites aient un durcissement qui bloquera ce type d'usurpation de connexion qui nécessiterait plus d'étapes ci-dessous pour le contourner.
  2. Modifiez la commande cURL pour pouvoir enregistrer le cookie de session après la connexion

    • Supprimer l'entrée -H 'Cookie: <somestuff>'
    • Ajouter après curlau début-c login_cookie.txt
    • Essayez d'exécuter cette commande curl mise à jour et vous devriez obtenir un nouveau fichier 'login_cookie.txt'dans le même dossier
  3. Appelez une nouvelle page Web en utilisant ce nouveau cookie qui nécessite que vous soyez connecté

    • curl -b login_cookie.txt <url_that_requires_log_in>

J'ai essayé cela sur Ubuntu 20.04 et cela fonctionne à merveille.

Timothy C. Quinn
la source