[cURL Howto]
Puedes utilizar la librería cURL y el comando
curl
para diseñar tu propia Petición y explorar la Respuesta. Hay muchos usos posibles, como por ejemplo, una API de depuración, para realizar web hacking o pen testing, entre los usos más creativos.curl
es una herramienta para transferir datos desde o hacia un servidor, utilizando uno de los protocolos soportados (por ejemplo, FTP, GOPHER, HTTP, HTTPS, IMAP, LDAP, POP3, RTMP, SCP, SFTP, SMTP, TELNET). El comando está diseñado para funcionar sin interacción por parte del usuario.curl
ofrece una amplia cantidad de trucos útiles tales como soporte de proxy, autenticación de usuario, subida a FTP, anunciar peticiones HTTP, conexiones SSL, cookies,
continuar o resumir transferencia de ficheros, Metalink, y mucho mas. Como podrás ver abajo, el número de características hará que te de vueltas la cabeza!Por lo tanto,
curl
es verdaderamente un comando poderoso, sin embargo esto lo hace a un costo de complejidad. Aquí mostraré algunos de los casos de uso del mundo real.La URL
La sintaxis de la URL es independiente del protocolo. Si especificas una URL sin el prefijo del protocolo (protocolo://
), curl
intentará adivinar cual es el protocolo que quieres utilizar. Intentará utilizar el protocolo determinado HTTP pero también intentará en otros protocolos basados en prefijos de nombres usados frecuentemente. Por ejemplo, para un host que el nombre inicie con “ftp.” curl
asumirá que quieres hablar el lenguaje usado en FTP.Puedes especificar multiples URLs o parte de ellas escribiendo unas partes de ellas dentro de llaves, como por ejemplo:
curl en.wikipedia.org/wiki/{FTP,SCP,TELNET}
Tambien puedes establecer seuencias de series alfanuméricas utilizando corchetes
[ ]
como en estos ejemplos:curl forums.example.com/showthread.php?t=[1758900-1758913]
curl numeros.com/file[1-100].txt
curl numeros.com/file[001-100].txt
curl letras.com/file[a-z].txt
No se soportan secuencias anidadas, pero puede utilizar cuantas quieras una después de otra:
curl cualquiersitio.org/file[2010-2015]/vol[1-5]/parte{a,b,c}.html
Se puede especificar cualquier cantidad de URLs en la línea de comandos. Éstas serán ejecutadas en una manera secuencial en el orden especificado.
Se puede espedificar un contador de pasos de avance para los rangos para obtener cada Nth posiciones de números o letras:
curl numeros.com/file[1-100:10].txt
curl letras.com/file[a-z:2].txt
Rastrear el volcado [Trace Dump]
Para analizar en profundidad qué es lo que enviamos y qué es lo que recibimos, podríamos guardar absolutamente todo en un fichero, esto es tan facil como digitar en la línea de comandos:curl --trace-ascii VolcadoDeDepuracion.txt URL
Guardar a Disco
Si se quiere guardar las Respuestas al disco se puede utlizar la opción-o <fichero>
. Si se están utilizando {}
or []
para ejecutar múltiples documentos, se puede utlizar ‘#
‘
seguido por un número en el especificador. Esa variable será reemplazada con la cadena actual para la URL que esté siendo ejecutada en ese instante. Recuerda proteger la URL en la línea de comandos añadiendo comillas dobles si se recibe el mensaje de error:internal error: invalid pattern type (0)
.Ejemplos:
curl 'es.wikipedia.org/{FTP,TFTP,SFTP}' -o "#1.html"
curl arxiv.org/pdf/13[01-11].36[00-75].pdf -o "arXiv13#1.36#2.pdf"
La opción
-O
escribe la salida a un fichero local llamado como el fichero remoto que queremos obtener (solamente se utiliza la parte del nombre del fichero remoto, la parte de la ruta del fichero es eliminada). Se usa solamente el nombre del fichero remoto para guardar lo que se ha extraído de la URL proporcionada, nada mas.Consecuentemente, el fichero será guardado en el directorio actual en el que se está trabajando (desde donde decidió ejecutar
curl
en la línea de comandos. Si se quiere guardar el fichero en un directorio distinto, asegúrese de cambiarse al directorio adecuado antes de invocar curl
:curl -O arxiv.org/pdf/1301.3600.pdf
Solamente la parte del fichero remoto es utilizado, por lo tanto, el fichero será guardado como
1301.3600.pdf
.Establecer el método de Petición HTTP
El método HTTP predeterminado decurl
, GET, puede ser establecido a cualquier método que se necesite utilizando la opción -X <command>
. Las figuras principales en esto, POST, PUT, DELETE, y aún los métodos personalizados, pueden ser especificados:curl -X POST echo.httpkit.com
Normalmente no se necesitará esta opción. Todos los tipos de peticiones como GET, HEAD, POST y PUT más bien son invocados mediante el uso de las opciones de la línea de comandos.
Formularios
Los formularios son como un sitio web presenta una página HTML con campos para que el usuario ingrese datos en ellos, y de alguna manera presione sobre algo que diga ‘enviar’ con forma de botón para obtener esos datos y eviarlos al servidor.Típicamente, el servidor usa los datos enviados para decidir qué hacer. Como utilizar las palabras que se han ingresado y buscar en una base de datos, o para añadir esta información en un sistema de rastreo/seguimiento de errores, mostrar la dirección ingresada sobre un mapa o utilizar la información como un indicador de registro verificando que el usuario le está permitido ver lo que debe autorizado para ver.
Utilizando la opción
-d
se puede especificar nombres y valores codificados en la URL:curl -d "prefisso=051" -d "numero=806060" -d "Prosegui=Verifica" -d "form_name=verifica_copertura_ehiveco" http://www.ovus.it/verifica_copertura_ehiveco.php
Un camino muy común para las aplicaciones basadas en HTML para pasar el estado de la información entre las páginas, es añadir campos ocultos en los formularios. Los campos ocultos ya están completados con información, y ellos no pueden ser mostrados al usuario y tienen que ser pasados de largo tal como el resto de los otros campos. Para
curl
no hay diferencia entre ellos, sólo necesitas en la línea de comandos.Establecer Peticiones de Cabecera [Set Request Headers]
Las Peticiones de Cabeceras o "Request headers" permite a los clientes proveer a los servidores con meta información sobre cosas tal como Autorización, capacidades, y tipo de contenido en el cuerpo de la página. OAuth2 utiliza una cabeceraAuthorization
para pasar señales de acceso, por ejemplo.Las cabeceras personalizadas se pueden establecer en curl utilizando la opción
-H
:curl -H "Authorization: OAuth 2c4419d1aabeec" http://echo.httpkit.com
curl -H "Accept: application/json" -H "Authorization: OAuth 2c3455d1aeffc" http://echo.httpkit.com
Hay que notar que si se debería añadir una cabecera personalizada que tiene el mismo nombre de una cabecera interna curl utilizará la cabecera establecida de forma externa en lugar de la interna. No se deberían reemplazar cabeceras que son establecidas de forma interna sin saber perfectamente bien qué es lo que se está haciendo. Eliminar una cabecera interna dando un reemplazo sin contenido en el lado derecho de los dos puntos, como en:
-H "Host:"
.Si se envía la cabecera personalizada sin valor alguno, entonces esta cabecera debe ser finalizada con punto y coma, tal como:
-H "X-Custom-Header;"
para enviar "X-Custom-Header:"
.curl
asegurará que cada cabecera que se añada o se elimine sea enviada con el marcador apropiado de "fin-de-línea", por lo tanto, no se debería añadir esto como parte del contenido de la cabecera: saltos de línea o retornos de carro, lo único que harán es estropearte las cosas.Referer
Una petición HTTP podría incluir un camporeferer
, el cual puede ser usado para decir desde cual URL el cliente obtuvo un recurso en particular. Algunos programas/scripts revisan el campo referer
de las peticiones para verificar que este no está llegando de un sitio externo o de una página desconocida. Mientras que esto es una forma estúpida de verificar algo y que puede ser fácilmente forzado, muchos scripts todavía lo hacen de esta forma.Esto puede ser establecido con el indicador
-H, --header
por supuesto. Cuando se utiliza con -L, --location
se puede añadir ";auto"
al indicador --referer
de la URL para hacer que automáticamente curl establezca la URL previa cuando de seguimiento a una cabecera Location:
.La cadena
";auto"
puede ser utilizada ella sola, aún si no se estableció un --referer
inicial.curl -e google.com http://echo.httpkit.com
User Agent
Para especificar la cadena User-Agent y envarla al servidor HTTP se puede utilizar el modificador--user-agent
. Para codificar espacios en blanco en la cadena, hay que encerrar la cadena entre comillas simples. Por supuesto, esto también puede ser establecido con la opción -H, --header
.Muchas aplicaciones utilizan esta información para decidir como mostrar las páginas. A veces, notarás que obtener una página con curl no devolverá la misma página que puedes obtener si accedes o la visualizas con tu navegador favorito. Es allí cuando sabes que es tiempo de establecer el campo User Agent para engañar al servidor y hacerlo creer que tú eres uno de esos navegadores:
curl
-A "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; en-us)
AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7
Safari/6533.18.5" http://echo.httpkit.com
Cookies
La forma en que los navegadores web hacen “control de estado en el lado del cliente” es utilizando Cookies. Las cookies son solamente nombres con contenidos asociados. Las cookies son enviadas al cliente por el servidor. El servidor le dice al cliente por qué ruta y nombre de host éste quiere que la cookie sea enviada de regreso, así también en ella envía información de la fecha de caducidad y unas cuantas propiedades mas.Cuando un cliente se comunica con un servidor por medio de un nombre y una ruta que se ha establecido previamente en una cookie que se ha recibido, el cliente envía de regreso las cookies y sus contenidos al servidor, a menos que esta ya haya caducado.
Muchas aplicaciones y servidores utilizan este método para conectar una serie de peticiones dentro de una sola sesión lógica. Para poder utilizar curl en tales situaciones, debemos poder grabar y enviar de regreso las cookies en la forma que el servidor web las espera. De la misma manera que los navegadores interactúan con ellas.
De una forma supuesta, la data recivida previamente del servidor se encuentra en una línea
"Set-Cookie:"
. La data debería estar en el formato "NAME1=VALUE1; NAME2=VALUE2"
.Sino se utiliza el símbolo igual ( = ) en la línea, es tratado como un nombre de fichero de donde se suele leer las líenas almacenadas previamente en la cookie, el cual debería ser utilizado en esta sesión si ellos se emparentan.
Al utilizar este métido también se actuva el "analizador de cookies" el cual hará que curl grabe las cookies entrantes, lo cual podría ser manipulable si se está utilizando en combinación con la opción
-L, --location
.El formato de archivo de donde se leen las cookies deberían ser cabeceras planas HTTP o en el formato de archivo de cookie de Netscape/Mozilla. NOTE que el fichero especificado con la opción
-b, --cookie
es solamente utilizado como entrada. Las cookies no serán almacenadas en el fichero. Para almacenar cookies, hay que utilizar las opciones -c, --cookie-jar
o también se pueden cabeceras HTTP a un fichero utilizando el modificador -D, --dump-header
:curl --cookie "name=whitehatty" http://echo.httpkit.com
curl -c cookies.txt http://www.facebook.com
sed -i '' s/#HttpOnly_\.facebook\.com/echo\.httpkit\.com/g cookies.txt
curl --cookie cookies.txt http://echo.httpkit.com
curl -b cookies.txt --cookie-jar newcookies.txt http://echo.httpkit.com
curl --dump-header headers_and_cookies http://www.facebook.com
0 comentarios:
Publicar un comentario