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Ă© Ă 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 amenĂ© Ă 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
኿