Header Ads Widget

Ticker

6/recent/ticker-posts

Comprender los poderes ocultos del rizo

 



curl es extremadamente poderoso; desafortunadamente, gran parte de este poder está algo escondido en la no verbosidad intencional y la complejidad subyacente de sus numerosos indicadores, configuraciones y opciones. Una vez entendido, curl cuenta con una amplia gama de opciones poderosas. Hoy, cubriremos algunas de estas opciones y discutiremos el poder oculto detrás de uno de los proyectos de código abierto más populares y queridos.

Tuvimos el honor de recibir al fundador de curl, Daniel Stenberg, en la Cumbre de la Plataforma 2019 . Mira su sesión Just Curl It aquí:

¿Qué es rizo?

logotipo de rizo

curl : una herramienta de línea de comandos y una biblioteca para transferir datos con URL.

curl es un proyecto de código abierto que se compone de dos partes: curlpropiamente dicha y libcurlcurl es una herramienta de línea de comandos que aprovecha la sintaxis de la URL para recibir o enviar datos y tiene una amplia gama de características y banderas que le permiten hacer esto con diferentes propósitos y enfoques. libcurl, por otro lado, es una biblioteca gratuita de transferencia de URL del lado del cliente que permite una buena parte de esta funcionalidad. Curl a menudo se conoce como una solución Swiss Army Knife, ya que tiene una amplia gama de poderosas banderas y opciones que ofrecen una amplia gama de efectos asombrosos.

curl es portátil, compatible con versiones anteriores y, según sus propias estimaciones, tiene millones de combinaciones de construcción, lo que permite un conjunto de funciones y opciones altamente fluido. curl actualmente cuenta con soporte para 24 protocolos y tiene 226 opciones de línea de comandos. Para nuestros propósitos en esta pieza, nos ceñiremos a los poderes ocultos para la manipulación HTTPS en curl y utilizaremos en gran medida un subconjunto más pequeño de banderas.

Una cosa a tener en cuenta sobre el rizo: es mínimo por defecto y diseño. Realmente solo hace lo que necesita hacer (o lo que entendió que era su propósito). Una solicitud de curl básica proporciona solo encabezados básicos cuando se define y no cuenta con una funcionalidad elegante. Eso puede parecer que implica que curl es simple en la práctica, pero la realidad es que curl funciona con una serie de palancas y conmutadores: las funciones se pueden activar y desactivar una por una, y la combinación de estas palancas y conmutadores puede ofrecer una potencia increíble , en efecto.

Antes de sumergirnos en los geniales poderes ocultos dentro de curl, primero deberíamos ver cómo se ve una solicitud de curl regular.

Solicitudes estándar

En su forma más básica, podemos hacer una solicitud de curl de la siguiente manera:

curl example.com

Desafortunadamente, dicha llamada no tiene encabezados de respuesta (recuerde, curl es mínimo por diseño). Para obtener esos encabezados de respuesta, podemos usar la -ibandera:

curl -i https://example.com

Para llevar esto un paso más allá, podemos pasar la salida a un sistema de renderizado para obtener respuestas más complejas:

curl https://example.com/json | jq

Solicitudes estándar más complejas

Hasta este punto, puede parecer que curl ofrece algunos resultados relativamente simplistas. Aunque pudimos ver la salida JSON y hacerla legible usando jq, todavía estamos haciendo una solicitud muy básica. Para un caso de uso más complejo, podemos mirar las redirecciones. Los redireccionamientos son extremadamente comunes en las API HTTP, por lo que manejar esto puede ser fundamental para nuestro flujo. Para seguir una redirección, simplemente podemos realizar la siguiente solicitud (un poco más compleja):

curl -I -L https://example.com/redirected

Solicitudes híbridas

Un caso de uso interesante del sistema de solicitudes es la utilización de solicitudes híbridas. En curl, se pueden combinar diferentes solicitudes en la misma línea de comando de la siguiente manera:

curl -d user=daniel https://example.com https://another.example.com

Es de destacar el hecho de que no existe un límite real para la cantidad de URL que se pueden usar en dicho esquema, lo que significa que, en teoría, podría realizar una gran cantidad de solicitudes a una gran cantidad de puntos finales de API en una sola línea CLI. Esto es especialmente útil cuando se deben realizar varias solicitudes para fusionar el contenido; de hecho, en este caso de uso, podría usar el mismo enfoque híbrido que se indica aquí y luego canalizar estos contenidos a un nombre de archivo para esfuerzos combinatorios.

También puede establecer el orden específico de este proceso de la --nextsiguiente manera:

curl -d user=daniel https://example.com --next https://another.example.com

Por el contrario, si desea hacer diferentes cosas en la misma línea, ¡también puede hacerlo!

curl https://example.com --next -d user=daniel https://another.example.com

Publicación avanzada

Como ejemplo de solicitudes más complejas que se pueden realizar con solicitudes curl básicas, podemos echar un vistazo a algunas POSTopciones. Primero, veamos una POSTsolicitud muy simple :

curl -d @file https://example.com receiver -o saved

En este caso, hemos publicado un archivo muy simple usando la -dbandera y el @fileesquema de nombres de archivos. ¿Qué pasa si quisiéramos nombrar este archivo usando un método más complejo? De hecho, podemos usar curl para nombrar un POSTarchivo ed usando una salida canalizada. Las tuberías en curl funcionan de la misma manera que en cualquier CLI, ya que toman la salida de algo y la utilizan como entrada para algo. En este caso, usaremos ls -lun comando de lista de archivos para generar el nombre de archivo utilizado:

ls -l | curl -d @- https://example.com/receiver -o saved

Esta solicitud toma los resultados ls -ly los genera como el nombre de archivo para el POSTproceso. Esta es una manera maravillosa de sincronizar la carga de archivos de uno a uno mientras trabajamos en la CLI. Más que eso, representa el poder detrás de la tubería en sí: crea un puente entre la experiencia interior y exterior y hace que la CLI en sí sea un puente sólido entre distintos tipos de datos y ubicaciones.

Aumentar la verbosidad

Las solicitudes son útiles, por supuesto, pero el proceso de emitir esa solicitud y ver el proceso como un todo puede ser difícil de ver. Afortunadamente, curl admite una amplia gama de opciones para solicitudes de curl transparentes.

Una de las formas más fáciles de ver más sobre lo que hace curl es simplemente generar un registro más detallado de la interacción. Para hacer eso, podemos pasar fácilmente la -vbandera para requerir mayor verbosidad:

curl -v https://example.com -o /dev/null

Esta solicitud ciertamente le mostrará una cantidad mucho mayor de información, pero incluso esta información se limita a la línea de comandos en sí. Afortunadamente, existen dos métodos increíblemente sólidos para inspeccionar esta actividad aún más profundamente.

El primero, y posiblemente el más denso, es simplemente enviar a la --trace-asciifunción todo lo que ocurre en curl Esta función tomará todo lo que suceda durante el proceso de la solicitud y lo generará como una salida ASCII para analizarlo y visualizarlo. Esto se puede hacer aprovechando la siguiente solicitud:

curl https://example.com/ -d sendthisdata --trace-ascii

Otra gran opción es utilizar la variable ambiental SSLKEYLOGFILEEl uso de esta variable le permitirá guardar la actividad de tráfico cifrado en un archivo definido, abriendo los datos rastreados para su lectura por una solución como Wireshark. Para hacer esto, debemos establecer nuestra variable:

export SSLKEYLOGFILE=$HOME/tmp/tlskey

Desde aquí, podemos realizar cualquier solicitud de curl que queramos. Una vez que se ha realizado esta solicitud, debemos decirle a Wireshark dónde se almacenan los secretos utilizando su archivo de configuración para apuntar hacia el tlskeyarchivo. Desde aquí, podemos usar Wireshark (o cualquier herramienta de espionaje) para leer todo lo que ocurrió durante el proceso de solicitud con extremo detalle.

Sea más flexible

Una de las cosas que curl hace realmente bien es que le permite al usuario ser muy flexible tanto con la forma en que hacen las solicitudes como con la forma en que parecen hacerlas. Por ejemplo, curl le permite pasar encabezados HTTP personalizados; en este caso, incluso podríamos usar esto para ocultar un encabezado específico como user-agent:

curl https://example.com -H "User-agent: removed"

Los encabezados tampoco son lo único que se puede cambiar; incluso podemos cambiar el método específico que estamos usando para nuestra interacción específica con una granularidad bastante alta. Por ejemplo, podemos usar un método como el SWOOSHmétodo de curl para hacer un tipo más específico de PUT:

curl -T localfile -X SWOOSH https://example.com/remove_name -o save

Por supuesto, hay situaciones en las que nuestra flexibilidad no debe estar en la solicitud, sino en nuestro entorno. Un caso de prueba podría ser servidores de prueba internos a nuestro entorno de prueba. Si tenemos un servidor encendido 172.0.0.1, es posible que nos encontremos con un error con certificados que detengan nuestra solicitud e impidan cualquiera de nuestros esfuerzos. Podemos utilizar la gran flexibilidad de curl para indicar al sistema que espere que el certificado no coincida y que se resuelva correctamente:

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

De esta manera, no solo hemos sido flexibles en nuestras solicitudes, también hemos sido bastante flexibles en nuestras metodologías. Incluso podemos cambiar los protocolos entendidos que estamos usando; por ejemplo, podemos configurar diferentes versiones de HTTP dependiendo de nuestra solicitud de comando actual:

curl --http1.0 https://example.com
curl --http2 https://example.com

Aprovechamiento de las cookies

Por supuesto, no todo lo que quisiéramos hacer con curl es simple o fácil de hacer con solicitudes básicas. Hay algunas interacciones complejas y casos de uso que ciertamente podemos aprovechar usando curl. Como ejemplo, supongamos que queremos utilizar cookies específicas en una solicitud específica. ¡Podríamos hacer eso usando el sistema de cookies de curl! Para hacer eso, primero debemos guardar nuestras cookies en el archivo especificado:

curl -c cookiejar.txt https://example.com

Cuando hacemos nuestra próxima solicitud, podemos especificar que el motor de cookies usa esa cookie configurada:

curl -b cookiejar.txt https://example.com

Este es un gran caso de uso para iniciar sesión en un recurso: podríamos realizar fácilmente una solicitud a, digamos, una URL de inicio de sesión, y una vez que pasamos las credenciales y obtenemos las cookies de inicio de sesión, podríamos aprovechar esa cookie guardada en todo el resto de nuestras solicitudes.

Compilación y mimetismo

Finalmente, curl tiene varias opciones excelentes para compilar nuestro contenido de curl e imitar las actividades de curl en general. Por ejemplo, en Linux, podemos usar gccen combinación con el proceso de código fuente en curl para empaquetar nuestros operantes curl como una aplicación. Primero, debemos exportar el contenido al código fuente:

curl https://example.com --libcurl sourcecode.c

Desde aquí, podemos usar gcc para compilar el código fuente en una aplicación adecuada:

gcc sourcecode.c -lcurl -o ./myapp

Por supuesto, a veces no queremos una aplicación completa; de hecho, es posible que simplemente deseemos imitar la actividad de un navegador conocido. Los navegadores modernos lo han hecho posible al aprovechar "copiar como rizo": esta opción está disponible en Chrome, Firefox, Safari y Edge, por lo que es muy probable que tenga esto integrado en su navegador en este momento. Simplemente puede copiar una actividad de red como curl, lo que le permite copiar esa acción para examinarla, compilarla en una aplicación o incluso conectarla a otras acciones. ¡El cielo es el límite!

Conclusión

curl es una opción muy poderosa para los desarrolladores web modernos, ya que presenta algo para casi todos: en el lenguaje común, es una verdadera navaja suiza, que ofrece un millón de métodos y combinaciones para hacer prácticamente lo que uno quiera. Su simplicidad a primera vista es algo engañosa: como hemos demostrado hoy, curl puede realizar interacciones complejas, manejar las cookies de formas interesantes y útiles e incluso exponer sus funciones internas con un nivel de detalle extremo.

¿Qué opinas sobre curl? ¿Conoce alguna función que no cubrimos aquí que le parezca sumamente útil? ¡Háganos saber en los comentarios a continuación!

Publicar un comentario

0 Comentarios