cClaude.rocks ☕ Le blog

[Nouvelles technologies, sciences et coups de gueule…]

Menu

Cas d’utilisation

Parfois, vous voulez exĂ©cuter la commande cURL sur un serveur qui gĂšre plusieurs sites web (sur le mĂȘme port), mais vous ne souhaitez pas vraiment que cURL rĂ©solve le nom d’hĂŽte dans l’URL donnĂ©e.

Vous savez l’adresse IP du serveur, et cependant la rĂ©solution DNS ne vous permet pas d’atteindre le serveur depuis la machine sur laquelle vous souhaitez exĂ©cuter cURL.

Typiquement lors de la prĂ©paration du lancement d'un site Web ou du dĂ©bogage de problĂšmes avec un site dĂ©jĂ  en ligne, il peut parfois ĂȘtre utile de contourner les couches CDN et proxy lors de la demande de contenu du site en envoyant ces demandes Web directement Ă  une adresse IP spĂ©cifique sans utiliser l'enregistrement DNS public du site.

Cette pratique consistant Ă  « épingler » une requĂȘte Web directement sur un serveur peut ĂȘtre accomplie en modifiant votre fichier /etc/hosts, ce qui entraĂźnera le routage des requĂȘtes pour un nom de domaine spĂ©cifiĂ© (par exemple : « www.example.com ») Ă  partir de votre machine locale Ă  une adresse IP spĂ©cifiĂ©e (par exemple : 127.0.0.1) jusqu’à ce que les modifications que vous avez apportĂ©es Ă  /etc/hosts soient annulĂ©es.

Cependant, que faire si vous souhaitez Ă©pingler une seule requĂȘte Ă  une adresse IP, sans modifier les fichiers de configuration de votre systĂšme ? Heureusement, ce type d’épinglage de requĂȘtes « ad hoc » est possible via la ligne de commande avec cURL, qui fournit une option de rĂ©solution spĂ©ciale, formatĂ©e comme suit :

--resolve [DOMAIN]:[PORT]:[IP]

Cela acheminera toutes les requĂȘtes Web effectuĂ©es lors de l’exĂ©cution d’une commande cURL qui correspond Ă  un [DOMAINE] et un [PORT] donnĂ©s Ă  l’adresse [IP] spĂ©cifiĂ©e. Les valeurs spĂ©cifiĂ©es par cette option (qui peuvent ĂȘtre invoquĂ©es plusieurs fois dans une seule commande pour acheminer plusieurs combinaisons domaine/port vers diverses adresses IP) s’appliqueront Ă  la demande initiale, ainsi qu’à toutes les redirections que cURL sera amener Ă  suivre.


ඏ

Les solutions

Bricoler votre fichier hosts

Comme nous l’avons vu plus haut, il est possible de dĂ©finir le nom de domaine dans le fichier /etc/hosts et de l’associer Ă  l’adresse IP qui vous souhaitez utiliser.

Cependant, cela affectera l’ensemble de la machine et ce n’est pas nĂ©cessaire votre souhait.


Fabriquer une fausse entĂȘte http avec le bon nom d’hĂŽte

Une maniĂšre classique et facile Ă  comprendre est d’envoyer votre requĂȘte vers le serveur souhaiter en bricolant l’entĂȘte HTTP. Le serveur HTTP pourra alors traiter la rĂ©ponse pour le nom de serveur souhaiter.

ConcrĂštement si vous exĂ©cutez votre site de test HTTP « example.com » sur localhost (127.0.0.1) et souhaitez vĂ©rifier qu’il fonctionne :

curl --header "Host: example.com" http://127.0.0.1/

Utiliser cURL ainsi permettra de faire fonctionner le systĂšme de cookies au nom du domain « example.com » dans ce cas, mais cela Ă©chouera lamentablement si la page redirige vers un autre hĂŽte (dans le cas oĂč le suivi de redirection est activité : --location) car cURL enverra Ă©galement le faux entĂȘte Host: dans toutes les autres demandes.

L’option --header annule intelligemment l’entĂȘte Host: intĂ©grĂ©e donnĂ©e quand un entĂȘte personnalisĂ© est fourni afin que seul celui transmis par l’utilisateur soit envoyĂ© dans la demande.


Une meilleure façon de gĂ©nĂ©rer une fausse entĂȘte

Aujourd’hui le protocole HTTPS devient la norme et simuler l’hĂŽte : l’en-tĂȘte ne suffit pas. Un serveur HTTPS doit Ă©galement obtenir le nom du serveur dĂ©jĂ  fourni dans la nĂ©gociation TLS afin de savoir quel certificat utiliser. Le nom est fourni dans le champ SNI. La commande cURL doit Ă©galement connaĂźtre le nom d’hĂŽte correct pour vĂ©rifier le certificat de serveur (les certificats de serveur sont rarement enregistrĂ©s pour une adresse IP). cURL extrait le nom Ă  utiliser dans les deux cas Ă  partir de l’URL fournie.

Comme nous ne pouvons pas simplement mettre l’adresse IP dans l’URL pour que cela fonctionne, nous inversons l’approche et donnons Ă  la place l’URL appropriĂ©e Ă  cURL mais avec une adresse IP personnalisĂ©e Ă  utiliser pour le nom d’hĂŽte que nous avons dĂ©fini. L’option --resolve de ligne de commande est notre amie :

curl --resolve example.com:443:127.0.0.1 https://example.com/

Sous le capot, cette option remplit le cache DNS de cURL avec une entrĂ©e personnalisĂ©e pour le port « example.com » 443 avec l’adresse 127.0.0.1, donc lorsque cURL veut se connecter Ă  ce nom d’hĂŽte, il trouve votre adresse spĂ©cialement conçue et s’y connecte au lieu de l’adresse IP que le « vrai » nom rĂ©soudrait autrement.

Cette mĂ©thode fonctionne Ă©galement parfaitement lorsque vous suivez des redirections, car toute autre utilisation du mĂȘme nom d’hĂŽte se rĂ©soudra toujours Ă  la mĂȘme adresse IP et la redirection vers un autre nom d’hĂŽte se rĂ©soudra alors correctement. Vous pouvez mĂȘme utiliser cette option plusieurs fois sur la ligne de commande pour ajouter des adresses personnalisĂ©es pour plusieurs noms. Vous pouvez Ă©galement ajouter plusieurs adresses IP pour chaque nom si vous le souhaitez.


Se connecter Ă  un autre hĂŽte par son nom

Comme indiquĂ© ci-dessus, --resolve est gĂ©nial si vous souhaitez pointer cURL vers une adresse IP connue spĂ©cifique. Mais parfois, ce n’est pas exactement ce que vous voulez non plus.

Imaginez que vous ayez un nom d’hĂŽte qui se rĂ©sout en un certain nombre de noms d’hĂŽtes diffĂ©rents, Ă©ventuellement un certain nombre de serveurs frontaux pour le mĂȘme site / service. Pas complĂštement inconnu. Imaginez maintenant que vous souhaitez Ă©mettre votre commande cURL vers un serveur spĂ©cifique parmi les serveurs frontaux. C’est un serveur qui sert « example.com » mais le serveur individuel est appelĂ© « host-47.example.com ».

Vous pouvez rĂ©soudre le nom d’hĂŽte dans une premiĂšre Ă©tape avant d’utiliser cURL et utilisez --resolve comme indiquĂ© ci-dessus.

Ou vous pouvez utiliser --connect-to, qui fonctionne Ă  la place sur la base d’un nom d’hĂŽte. En utilisant cela, vous pouvez faire en sorte que cURL remplace une paire spĂ©cifique de nom d’hĂŽte + numĂ©ro de port par une autre paire d’hĂŽte + numĂ©ro de port avant que le nom ne soit rĂ©solu !

curl --connect-to example.com:443:host-47.example.com:443 https://example.com/

Des combos fous

La plupart des options de cURL sont contrĂŽlĂ©es individuellement, ce qui signifie qu’il y a rarement une logique qui vous empĂȘche de les utiliser dans les combinaisons impressionnantes auxquelles vous pouvez penser.

--resolve, --connect-to et --header peuvent tous ĂȘtre utilisĂ©s dans la mĂȘme ligne de commande !

Connectez-vous Ă  un hĂŽte HTTPS exĂ©cutĂ© sur localhost, utilisez le nom correct pour SNI et la vĂ©rification de certificat, mais demandez toujours un hĂŽte distinct dans l’en-tĂȘte Host:? Bien sĂ»r pas de problĂšme:

curl --resolve example.com:443:127.0.0.1 https://example.com/ --header "Host: diff.example.com"

Tout ce qui précÚde avec libcurl ?

Lorsque vous avez fini de jouer avec les options cURL comme dĂ©crit ci-dessus et que vous souhaitez convertir vos lignes de commande en code libcurl Ă  la place, votre meilleur ami est d’invoquĂ© le paramĂštre : --libcurl.

Ajoutez simplement --libcurl example.c Ă  votre ligne de commande, et cURL gĂ©nĂ©rera le modĂšle de code C pour vous dans ce nom de fichier donnĂ©. Sur la base de ce modĂšle, l’utilisation correcte de ce code est gĂ©nĂ©ralement simple et vous aurez toutes les options Ă  lire de maniĂšre pratique.


ඏ

Références

኿


â„č 2006 - 2021 | 🏠 Retour Ă  l'accueil du domaine | 🏡 Retour Ă  l'accueil du blog