Cosa fa il ricciolo. curl_setopt - Imposta un'opzione per una sessione CURL. Invio dati POST

16 febbraio 2006 Jeff Felling

Curl ti aiuta a gestire i dati pubblicati sul Web Questo articolo illustra lo strumento gratuito Curl, che ti consente di inviare e ricevere pagine Web dalla riga di comando. Grazie a Curl, è facile automatizzarne molti

Curl ti aiuterà a gestire i dati pubblicati sul Web

Questo articolo illustra lo strumento gratuito Curl, che consente di inviare e ricevere pagine Web dalla riga di comando. Curl semplifica l'automazione di molte attività di sicurezza e amministrazione, come l'estrazione di una pagina Web per l'analisi o il download di una patch di sicurezza dal Web.

Installazione arricciata

Curl è incluso in molte distribuzioni Unix. Binari e sorgenti sono disponibili per la maggior parte degli altri sistemi operativi. Anche i programmatori PHP open source possono utilizzare Curl per accedere in modo sicuro ai contenuti Web direttamente dagli script PHP.

Curl richiede il pacchetto OpenSSL per funzionare con i siti Web Secure Sockets Layer (SSL). Esistono due versioni di Curl, una con SSL e una senza SSL. Consiglio il primo, perché SSL protegge i dati in modo sicuro.

Prima di poter utilizzare Curl con la funzionalità SSL, devi scaricare e installare separatamente il pacchetto OpenSSL dal web. I binari di OpenSSL per Windows possono essere scaricati dal sito del progetto GnuWin32 SourceForge all'indirizzo . Questo sito ha anche molti altri strumenti utili portati su Windows.

Scarica e installa il pacchetto OpenSSL, quindi copia i due file DLL nella directory system32:

Copia "C:ProgrammiGnuWin32 binlibeay32.dll" %windir%system32 copia "C:ProgrammiGnuWin32 binlibssl32.dll" %windir%system32

Successivamente, puoi installare Curl. I binari Curl compatibili con SSL per Windows sono disponibili all'indirizzo http://curl.haxx.se/latest.cgi?curl=win32-ssl-sspi. La versione più recente, curl 7.15.0, è in win32-ssl-sspi.zip, che contiene il file curl.exe e la documentazione.

Dopo aver installato Curl, dovresti assicurarti che funzioni digitando il comando

Arricciare http://isc.sans.org/infocon.txt

Se sullo schermo appare una parola che rappresenta un colore (ad esempio, verde), allora Curl funziona. In questo semplice esempio, Curl recupera il contenuto Infocon dal sito Web Internet Storm Center del SANS Institute. Verde significa che Internet funziona normalmente e non sono state rilevate minacce gravi. Se, invece del verde, sullo schermo compaiono le parole giallo, arancione o rosso, allora metti da parte questo articolo e visita il sito http://isc.sans.org per conoscere gli stati ad alto rischio su Internet. In caso di errore, è necessario verificare che Curl sia installato correttamente.

In sostanza, Curl recupera una pagina Web e quindi stampa l'origine HTML della pagina sulla console. Tuttavia, le possibilità dell'utilità sono più ampie. Curl ha un controllo degli errori integrato. Ad esempio, il comando

Curl http://noserverqui

restituisce l'errore Curl: (6) Impossibile risolvere host: noserverhere; Host non trovato. I codici di errore possono essere utilizzati negli script per verificare la disponibilità di una pagina Web o la risposta di un server Web. Ad esempio, se utilizzi Curl per recuperare una pagina Web su base giornaliera, in particolare le statistiche giornaliere di un sito Web, puoi aggiungere codice sorgente allo script che cerca i codici di errore. Se Curl fornisce il codice di errore Curl: (7) non è riuscito a connettersi all'host, puoi inviare un avviso immediatamente o inviare un'e-mail.

Estrazione di dati crittografati

Uno dei vantaggi più importanti di Curl è la sua compatibilità con SSL. Le pagine HTTPS richieste vengono inviate crittografate sulla rete, quindi Curl visualizza il testo recuperato sullo schermo. Inoltre, Curl controlla i certificati - la data di scadenza del certificato, il nome host corrisponde al nome host del certificato e il livello di attendibilità del certificato radice - e avvisa se il certificato non è valido. L'opzione -cacert consente di specificare un file di certificato specifico. La verifica del certificato è disabilitata con l'opzione -k. Un approccio alternativo consiste nell'usare l'opzione -insecure.

Non solo per il WWW

Curl è più di un semplice invio di file su Internet. Con Curl puoi elencare velocemente le directory di un sito FTP:

Curl ftp://myftpsite

Per vedere le sottodirectory del sito, devi inserire il comando

Curl ftp://myftpsite/subdir/

Per scaricare un file dalla rete, basta specificare il nome del file nell'URL. Nell'esempio seguente, un file denominato readme.txt viene caricato direttamente dalla riga di comando e visualizzato sullo schermo:

Curl ftp://ftp.microsoft.com/deskapps/games/readme.txt

Spesso è più facile creare script con Curl per inserire file FTP piuttosto che utilizzare il comando FTP in modo interattivo.

Per impostazione predefinita, l'output viene scritto direttamente nella console, ma può essere reindirizzato a un file utilizzando le opzioni -o e -O. Per ottenere la pagina e salvarla su disco, utilizzare l'opzione -o. L'opzione -O salva la pagina risultante in un file locale e Curl recupera il nome del documento remoto. Se nell'URL non viene specificato alcun nome file, l'operazione avrà esito negativo. Se utilizzi Curl per inviare una query a un sito Web senza un nome file, ma desideri salvare il risultato in un file, puoi specificare il nome file sulla riga di comando, in questo modo:

Autenticazione

Curl fornisce metodi di autenticazione di base, digest e integrati. Sulla maggior parte dei siti, è possibile accedere alle pagine di autenticazione basate su moduli utilizzando le funzioni di invio di Curl, come verrà dimostrato a breve. Ciò significa che è possibile inviare i dati del modulo, come nome utente e password, a un sito Web remoto che richiede informazioni su una pagina Web. Puoi usare l'opzione -u per inviare le credenziali, oppure puoi incorporarle nell'URL, che tradizionalmente viene fatto in FTP, in questo modo:

Curl ftp://nome utente: [email protetta]

Utilizzando Curl, le tecniche prese in prestito da FTP possono essere trasferite su HTTP, come nell'esempio seguente:

Curl http://nomeutente:password @miositohtml/default.htm

Curl fornisce anche l'accesso alle pagine Web tramite un server proxy. Pertanto, Curl può essere configurato per utilizzare un server proxy per l'autenticazione di base, Digest e NTLM.

Leggi la documentazione

È difficile coprire tutte le numerose funzionalità di Curl in un articolo, incluso il caricamento di file sul server (-T), la visualizzazione solo delle informazioni nell'intestazione HTTP (-I), la visualizzazione di tutti i dati in modalità dettagliata (-V) e la visualizzazione nascosta uscita ( -s). Consiglio di dare un'occhiata più da vicino alle funzioni Curl nel tutorial pubblicato su http://curl.haxx.se/docs .

Esempio di ricciolo

Ora che hai familiarità con le basi di Curl, diamo un'occhiata a un semplice esempio di estrazione di dati da un sito Web dati i dati di input. Costruiamo un semplice strumento Whois che dimostri la facilità e la comodità dell'utilizzo di Curl e come inviare dati a un sito Web utilizzando l'opzione -d. In questo esempio, Curl invia l'indirizzo IP al sito Web Arin Whois e quindi recupera i risultati da quel sito. Whois cerca informazioni sul proprietario di un indirizzo IP.

È importante ricercare un sito Web prima di iniziare, perché il codice sorgente di ogni sito è diverso e Curl non funziona sempre allo stesso modo per tutti i siti. Una visita preliminare al sito consente di raccogliere le informazioni necessarie al funzionamento di Curl. In questo esempio, ho utilizzato il browser per visitare il sito Web http://www.arin.net/whois/, e ho notato che il sito ha un unico campo di inserimento dati in cui i visitatori indicano l'indirizzo IP a cui sono interessati. È necessario ottenere i dettagli di questo campo, che fa parte del modulo Web. Questo esempio utilizza lo script Perl formfind.pl ( http://cool.haxx.se/cvs.cgi/curl/perl/contrib/formfind?rev=HEAD&content-type=text/vnd.viewcvs-markup). Lo script Formfind.pl converte i dati del modulo in output utilizzabili e semplifica la ricerca manuale dei dati in HTML. Naturalmente, Perl deve essere distribuito sul computer per eseguire Formfind. Un buon pacchetto Perl Win32 può essere ordinato dal sito ActiveState ActivePerl all'indirizzo http://www.activestate.com .

Consideriamo un esempio in modo più dettagliato. Per prima cosa, diamo un'occhiata a un sito Web che contiene un modulo che richiede informazioni:

Curl -o whoisOutputFile http://www.arin.net/whois/

Questo comando recupera la pagina Whois da http://www.arin.net e la memorizza in un file di testo whoisOutputFile, che contiene il sorgente HTML che il browser riproduce quando si visita il sito.

Quindi è necessario trovare ed evidenziare i dati del modulo:

./formfind.pl

Formfind restituisce le variabili del modulo ei loro possibili valori. In questo esempio, i risultati di output sono abbastanza semplici (vedi sotto). schermo 1).

Notare i dati del modulo Input denominato queryinput. Questo è un campo di testo in cui Curl deve inviare l'indirizzo IP per cercare. L'indirizzo IP specifico non ha importanza: in questo esempio è stato utilizzato l'indirizzo Microsoft. Con l'opzione -d, l'indirizzo IP cercato viene inviato al campo queryinput:

Curl -d "queryinput=207.46.133.140" http://ws.arin.net/cgibin/whois.pl

Il comando Curl con l'opzione -d cerca i dati nel modulo, in questo caso queryinput, che è l'indirizzo IP da cercare. Questo cambia l'indirizzo di destinazione; il modulo deve inviare i dati a un nuovo URL che rappresenta lo script whois.pl. Il nuovo indirizzo di destinazione può essere visualizzato nell'output di formfind nella schermata 1.

In questo esempio si ottiene anche il testo sorgente HTML della risposta Whois, ma è nascosto da un gruppo di tag HTML. Per impostazione predefinita, il messaggio di stato Arricciatura mostra le dimensioni del documento, la percentuale di completamento e la velocità di trasferimento. È possibile ripulire un po' l'output e filtrare il nome dell'organizzazione che possiede l'indirizzo IP. Lo stato dell'arricciatura può essere disabilitato usando l'opzione -s. Il comando deve essere eseguito tramite grep per ottenere solo OrgName:

Curl -s -d "queryinput=207.46.133.140" http://ws.arin.net/cgibin/ whois.pl | grep OrgName

In questo esempio, l'output mostra che OrgName è Microsoft Corp.

@echo off curl -k -s -d "queryinput= %1" http://ws.arin.net/cgibin/ whois.pl | grep OrgName



CURL è un pacchetto software costituito da un'utilità della riga di comando e una libreria per il trasferimento di dati utilizzando la sintassi URL.

CURL supporta molti protocolli, inclusi DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet e TFTP.

Carica un singolo file
Il comando seguente otterrà il contenuto dell'URL e lo visualizzerà sullo standard output (cioè il tuo terminale).

Curl https://mi-al.ru/ > mi-al.htm % Totale % Ricevuto % Xferd Velocità media Tempo Tempo Tempo Corrente Caricamento Caricamento Totale speso Velocità sinistra 100 14378 0 14378 0 0 5387 0 --: --:- - 0:00:02 --:--:-- 5387

Salvataggio dell'output di cURL in un file
Possiamo salvare il risultato del comando curl in un file usando le opzioni -o/-O.
  • -o(o minuscolo) il risultato verrà salvato nel file specificato nella riga di comando
  • -O(O maiuscola) Il nome del file verrà preso dall'URL e verrà utilizzato per memorizzare i dati recuperati.

$ curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html

La pagina gettext.html verrà ora salvata in un file chiamato 'mygettext.html'. Quando curl viene eseguito con l'opzione -o, viene visualizzata una barra di avanzamento del download come questa.

% Totale % Ricevuto % Xferd Velocità media Tempo Tempo Tempo Corrente Caricamento Caricamento Totale speso Velocità sinistra 66 1215k 66 805k 0 0 33060 0 0:00:37 0:00:24 0:00:13 45900 100 1215k 100 1215k 0 0 39474 0 0:00:31 0:00:31 --:--:-- 68987

Quando usi curl -O (O maiuscola), salverà da solo il contenuto in un file chiamato 'gettext.html' sul computer locale.

$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html

Nota: quando curl ha bisogno di scrivere dati sul terminale, disattiva la barra di avanzamento in modo che non ci sia confusione nei dati stampati. Possiamo usare le opzioni '>'|'-o'|'-O' per passare i risultati a un file.

Selezione di più file contemporaneamente
Possiamo scaricare più file contemporaneamente fornendo tutti gli URL sulla riga di comando.

Arriccia -O URL1 -O URL2

Il comando seguente scaricherà sia index.html che gettext.html e li salverà con gli stessi nomi nella directory corrente.

Curl -O http://www.gnu.org/software/gettext/manual/html_node/index.html -O http://www.gnu.org/software/gettext/manual/gettext.html

Tieni presente che quando scarichiamo più file dallo stesso server come mostrato sopra, curl tenterà di riutilizzare la connessione.

Segui la posizione HTTP nelle intestazioni con l'opzione -L
Per impostazione predefinita, CURL non segue la posizione HTTP nelle intestazioni (reindirizzamenti). Quando la pagina Web richiesta viene spostata in un'altra posizione, la risposta appropriata verrà inviata nelle intestazioni della posizione HTTP.
Ad esempio, quando qualcuno digita google.com nella barra del browser dal proprio paese, verrà automaticamente reindirizzato a "google.co.xx". Questo viene fatto in base all'intestazione della posizione HTTP come mostrato di seguito.

Arricciare https://www.google.com/?gws_rd=ssl

302 spostato

302 spostato

Il documento è stato spostato qui.

L'output di cui sopra dice che il documento richiesto è stato spostato in "

Nascosto dagli ospiti

.
Puoi dire a curl di seguire i reindirizzamenti, questo viene fatto usando l'opzione -L come mostrato di seguito. Ora verrà caricato il codice sorgente html da

Nascosto dagli ospiti

.

Arricciatura -L https://www.google.com/?gws_rd=ssl

Riprendere un download precedente

Usando l'opzione -C puoi continuare un download interrotto per qualche motivo. Ciò sarà utile quando il download di file di grandi dimensioni non riesce.
Se diciamo "-C -", curl cercherà dove riprendere il download. Possiamo anche specificare '-C<смещение>'. L'offset di byte specificato verrà ignorato dall'inizio del file di origine.
Avvia un grande download con curl e premi Ctrl-C per interrompere il download.

$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html ############### 20,1%

Il download è stato interrotto al 20,1%. Usando "curl -C -" possiamo continuare il download da dove eravamo rimasti. Ora il download continuerà al 20,1%.

Arricciatura -C - -O http://www.gnu.org/software/gettext/manual/gettext.html ################## 21,1%

Limitazione della velocità dei dati
Puoi limitare la quantità di velocità di trasferimento dati con l'opzione --limit-rate. Puoi passare la velocità massima come argomento.

$ curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html

Il comando sopra limiterà la velocità di trasferimento a 1000 byte/secondo. curl può utilizzare velocità più elevate ai picchi. Ma la velocità media sarà di circa 1000 byte/secondo.
La barra di avanzamento per il comando precedente è mostrata di seguito. Puoi vedere che la velocità attuale è di circa 1000 byte.

% Totale % Ricevuto % Xferd Velocità media Tempo Tempo Tempo Corrente Caricamento Carica Totale speso Velocità sinistra 1 1215k 1 13601 0 0 957 0 0:21:40 0:00:14 0:21:26 999 1 1215k 1 14601 0 0 960 0 0:21:36 0:00:15 0:21:21 999 1 1215k 1 15601 0 0 962 0 0:21:34 0:00:16 0:21:18 999

Carica un file solo se è stato modificato prima/dopo il tempo specificato
Puoi ottenere file che sono stati modificati dopo un certo tempo usando l'opzione -z in curl. Questo funzionerà sia per FTP che per HTTP.

Il comando sopra caricherà yy.html solo se è stato modificato dopo la data e l'ora specificate.

Il comando sopra scaricherà il file file.html se è stato modificato prima della data e dell'ora indicate. Digita 'man curl_getdate' per saperne di più sulle varie sintassi supportate per le espressioni di data.

Passaggio dell'autenticazione HTTP in cURL
A volte i siti Web richiedono un nome utente e una password per visualizzare il loro contenuto. Con l'opzione -u, puoi passare queste credenziali da cURL al server web come mostrato di seguito.

$ curl -u nome utente:URL password

Nota: per impostazione predefinita, curl utilizza l'autenticazione di base HTTP. Possiamo impostare altri metodi di autenticazione usando –ntlm | -digerire.


cURL può essere utilizzato anche per scaricare file da server FTP. Se il percorso FTP specificato è una directory, l'elenco dei file al suo interno verrà visualizzato per impostazione predefinita.

$ curl -u ftpuser:ftppass -O ftp://server_ftp/public_html/xss.php

Il comando sopra scaricherà il file xss.php dal server ftp e lo memorizzerà in una directory locale.

$ curl -u ftpuser:ftppass -O ftp://server_ftp/public_html/

Qui l'URL si riferisce a una directory. Pertanto, cURL creerà un elenco di file e directory all'URL specificato.


CURL supporta gli intervalli di URL. Quando viene fornito un intervallo, verranno caricati i file corrispondenti all'interno di tale intervallo. Ciò sarà utile quando si scaricano pacchetti da siti mirror FTP.

$ curl ftp://ftp.uk.debian.org/debian/pool/main//

Il comando sopra elencherà tutti i pacchetti nell'intervallo a-z nel terminale.

Caricamento di file su un server FTP
Curl può essere utilizzato anche per caricare su un server FTP con l'opzione -T.

$ curl -u ftpuser:ftppass -T miofile.txt ftp://ftp.testserver.com

Il comando sopra caricherà un file chiamato myfile.txt su un server FTP. Puoi anche caricare più file contemporaneamente utilizzando gli intervalli.

$ curl -u ftpuser:ftppass -T "(file1,file2)" ftp://ftp.testserver.com

Opzionalmente, possiamo usare "." per ottenere dallo standard input e passarlo alla macchina remota.

$ curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt

Il comando precedente prenderà l'output dell'utente dallo standard input e memorizzerà il contenuto sul server ftp sotto il nome 'myfile_1.txt'.
Puoi specificare "-T" per ogni URL e ogni coppia di file URL determinerà cosa caricare e dove

Maggiori informazioni con maggiore verbosità e opzione di tracciamento
Puoi scoprire cosa sta succedendo usando l'opzione -v. L'opzione -v attiva la modalità dettagliata e stampa i dettagli.

Arricciatura -v https://www.google.co.th/?gws_rd=ssl

Il comando sopra produrrà quanto segue

* URL ricostruito a: https://www.google.co.th/?gws_rd=ssl * Il nome host NON è stato trovato nella cache DNS * Tentativo 27.123.17.49... * Connesso a www.google.co.th (27.123. 17.49) porta 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.38.0 > Host: www.google.co.th > Accept: */* >< HTTP/1.1 200 OK < Date: Fri, 14 Aug 2015 23:07:20 GMT < Expires: -1 < Cache-Control: private, max-age=0 < Content-Type: text/html; charset=windows-874 < P3P: CP="This is not a P3P policy! See https://support.google.com/accounts/answer/151657?hl=en for more info." * Server gws is not blacklisted < Server: gws < X-XSS-Protection: 1; mode=block < X-Frame-Options: SAMEORIGIN < Set-Cookie: PREF=ID=1111111111111111:FF=0:TM=1439593640:LM=1439593640:V=1:S=FfuoPPpKbyzTdJ6T; expires=Sun, 13-Aug-2017 23:07:20 GMT; path=/; domain=.google.co.th ... ... ...

Se hai bisogno di informazioni più dettagliate, puoi usare l'opzione --trace. L'opzione --trace consentirà un dump di traccia completo di tutti i dati in entrata/uscita per il file specificato
curl dict://dict.org/d:girl:fd-eng-rus 220 pan.alephnull.com dictd 1.12.1/rf su Linux 3.14-1-amd64 <[email protetta]> 250 ok 150 1 definizioni recuperate 151 "girl" fd-eng-rus "English-Russian FreeDict Dictionary ver. 0.3" girl /gəːl/ girl. 250 ok 221 ciao

Maggiori informazioni su DICT possono essere trovate leggendo

Nascosto dagli ospiti

.

Utilizzo di un proxy per scaricare un file
Possiamo dire a cURL di usare un proxy per determinate operazioni, questo viene fatto con l'opzione -x. Abbiamo bisogno di impostare l'host proxy e la porta.

$ curl -x proxysever.test.com:3128 https://www.google.co.in/?gws_rd=ssl

Invio di e-mail utilizzando il protocollo SMTP in curl
cURL può essere utilizzato anche per inviare e-mail tramite SMTP. È necessario specificare l'indirizzo da cui, l'indirizzo a cui e l'indirizzo IP del server di posta come mostrato di seguito.

$ curl --mail-from [email protetta]--mail-rcpt [email protetta] smtp://mailserver.com

Una volta inserito il comando, inizierà l'attesa che l'utente inserisca i dati per la lettera. Quando hai finito di digitare il tuo messaggio, digita. (punto) come ultima riga e l'e-mail verrà inviata immediatamente.

Oggetto: Test Questa è una mail di prova.



Utilizzo di libcurl con C e Python

Lo sviluppo di applicazioni che si basano su protocolli a livello di applicazione come HTTP e FTP non è molto difficile, ma non è nemmeno banale. Inoltre, tale sviluppo non è sotto i riflettori, poiché nella maggior parte dei casi ciò che si trova al di sopra di questi protocolli è molto più importante. Libcurl è interessante in quanto si concentra sull'applicazione e non sull'aspetto transitorio dello sviluppo. Si noti che non molte applicazioni hanno il proprio stack TCP/IP, perché il riutilizzo di tutto il possibile riduce al minimo il carico sul programmatore e aumenta l'affidabilità dell'applicazione.

Questo articolo inizia con una breve introduzione ai protocolli a livello di applicazione e poi passa all'apprendimento di cURL, libcurl e come usarli.

Protocolli web

Lo sviluppo delle moderne applicazioni è significativamente diverso da quello che era nel recente passato. Le applicazioni odierne devono comunicare su una rete o Internet esponendo gli utenti a un'API o interfaccia di rete e fornire flessibilità tramite script personalizzati. In genere, le applicazioni moderne esportano l'interfaccia Web utilizzando HTTP e inviano notifiche di eccezione utilizzando il Simple Mail Transport Protocol (SMTP). Questi protocolli consentono a un browser Web in esecuzione su un dispositivo di inviare la configurazione o lo stato e di ricevere messaggi standard dai dispositivi a un client di posta elettronica standard (rispettivamente tramite HTTP e SMTP).

Questi servizi Web sono in genere costruiti sopra il livello socket dello stack del protocollo di rete (Figura 1). Il livello socket implementa un'API che risale al sistema operativo Berkeley Software Distribution (BSD) e isola i dettagli dei protocolli di trasporto e livello di rete sottostanti.

Figura 1. Stack del protocollo di rete e libcurl

I servizi Web forniscono la comunicazione tra i protocolli client e server. Nel contesto di HTTP, il server è il dispositivo finale e il client è il browser nella posizione remota. Per SMTP, il server è il gateway di posta o l'utente remoto e il client è il dispositivo finale. In alcuni casi, l'interazione del protocollo avviene in due fasi (richiesta e risposta), mentre in altri è necessario molto più traffico per mantenere la comunicazione. Questa interazione può creare difficoltà significative che vengono superate con API come libcurl.

Introduzione a cURL

Origine e contenuto di cURL

cURL è stato proposto da Daniel Stenberg, ma più di 600 programmatori hanno contribuito allo sviluppo. Indubbiamente, questa è una tecnologia utile con un'ampia gamma di applicazioni.

cURL è stato originariamente sviluppato come mezzo per spostare file tra endpoint utilizzando vari protocolli come FTP, HTTP, SCP e altri. All'inizio era un'utilità da riga di comando, ma ora è anche una libreria con collegamenti per oltre 30 lingue. Quindi ora, invece di utilizzare cURL dalla riga di comando, puoi creare applicazioni che includono queste importanti funzionalità. La libreria libcurl è anche portatile e supporta Linux®, IBM® AIX®, BSD, Solaris e molte altre varianti UNIX®.

Ottenere e installare cURL/libcurl

Ottenere e installare libcurl è facile, ma il processo dipende dalla distribuzione Linux. Su Ubuntu, questi pacchetti possono essere installati utilizzando l'utilità apt-get. Le prossime due righe mostrano come installare libcurl e le associazioni Python per libcurl:

$ sudo apt-get install libcurl3 $ sudo apt-get install python-pycurl

L'utilità apt-get assicura che tutte le dipendenze siano rispettate durante il processo di installazione.

cURL sulla riga di comando

cURL è nato come strumento da riga di comando per il trasferimento di dati utilizzando la sintassi URL (Uniform Resource Locator). A causa della popolarità di questa funzionalità in forma di riga di comando, è stata creata una libreria per integrarla nelle applicazioni. Oggi cURL per la riga di comando funge da wrapper per la libreria cURL. Questo articolo inizia con l'apprendimento di cURL sulla riga di comando e quindi si immerge nell'utilizzo come libreria.

Due usi tipici di cURL sono i trasferimenti di file che utilizzano i protocolli HTTP e FTP. cURL fornisce una semplice interfaccia per questi e altri protocolli. Per recuperare un file da un sito Web utilizzando HTTP, è sufficiente specificare cURL il nome del file locale in cui si desidera scrivere la pagina Web, nonché l'URL del sito Web e il file da caricare. Troppe parole per la semplice riga di comando mostrata nel Listato 1.

Listato 1. Un esempio di utilizzo di cURL per recuperare un file da un sito Web
$ curl -o test html www.exampledomain.com % Totale % Ricevuto % Xferd Velocità media Tempo Tempo Tempo Corrente Caricamento Caricamento Totale speso Velocità sinistra 100 43320 100 43320 0 0 55831 0 --:--:-- - -:-- :-- --:--:-- $89299

Nota che ho specificato un dominio, non un file, quindi otterrò il file radice (index.html). Per caricare questo file su un sito FTP utilizzando cURL, si specifica il file da caricare con l'opzione -T, quindi si immette l'URL del sito FTP e il percorso del file (Listato 2).

Listato 2. Un esempio di utilizzo di cURL per caricare un file su un sito FTP
$ curl -T test.html ftp://utente: [email protetta]/ftpdir/ % Totale % Ricevuto % Xferd Velocità media Tempo Tempo Corrente Caricamento Caricamento Totale speso Velocità sinistra 100 43320 0 0 100 43320 0 38946 0:00:01 0:00:01 --:--:- - 124k $

È più facile? È sufficiente padroneggiare alcuni semplici modelli e cURL sarà estremamente facile da usare. Ma la varietà di opzioni disponibili è molto ampia: la richiesta di aiuto dalla riga di comando cURL (--help) stampa 129 righe. Un gran numero di opzioni ti consente di controllare tutto, dalla verbosità alla sicurezza e vari elementi personalizzabili specifici del protocollo.

Dal punto di vista di uno sviluppatore, questo non è l'aspetto più piacevole di cURL. Entriamo nella libreria cURL e vediamo come aggiungere questi protocolli di trasferimento file alla tua applicazione.

cURL come libreria

Se hai guardato i linguaggi di scripting negli ultimi 10 anni, hai notato un chiaro cambiamento nella loro composizione. I linguaggi di scripting come Python, Ruby, Perl e molti altri includono non solo un livello socket, come C o C++, ma anche interfacce di protocollo del livello applicativo. Questi linguaggi di scripting contengono funzionalità di alto livello che rendono banale la creazione di un server o client HTTP, ad esempio. La libreria libcurl aggiunge funzionalità simili a linguaggi come C e C++, ma in un modo che può funzionare con molti linguaggi. Libcurl si comporta più o meno allo stesso modo in tutti i linguaggi che supporta, anche se poiché tali linguaggi possono variare ampiamente (C e Scheme), anche il modo in cui viene imposto questo comportamento può differire.

La libreria libcurl include funzioni che sono illustrate negli elenchi e, sotto forma di API, quindi può essere utilizzata in linguaggi di alto livello (oltre 30 oggi). Questo articolo fornisce due esempi di utilizzo di libcurl. Il primo esplora un semplice client HTTP in C (adatto per la creazione di Web spider) e il secondo è un semplice client HTTP in Python.

Client HTTP in linguaggio C

L'API C fornisce due API oltre alla funzionalità libcurl. Un'interfaccia semplice è una semplice API sincrona (cioè quando libcurl fa una richiesta, la esegue fino alla fine o a un messaggio di errore). La multiinterfaccia fornisce il controllo su libcurl, consentendo a un'applicazione di eseguire più trasferimenti simultanei e controllare dove e quando libcurl trasferisce i dati.

Questo esempio utilizza un'interfaccia semplice. Questa API fornisce un certo controllo sul processo di spostamento dei dati (usando i callback), ma è all'altezza del suo nome. Il Listato 3 mostra un esempio C per HTTP.

Listato 3. Client HTTP in C che utilizza la semplice interfaccia libcurl
#includere #includere #includere #define MAX_BUF 65536 carattere wr_buf; int wr_index; /* * Scrivi la funzione di callback dei dati (chiamata nel contesto di * curl_easy_perform. */ size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp) ( int segsize = size * nmemb; /* Verifica se questo i dati superano la dimensione del nostro buffer. In tal caso, * imposta il valore di contesto definito dall'utente e restituisce 0 per indicare un * problema da arricciare.*/ if (wr_index + segsize > MAX_BUF) ( *(int *)userp = 1; return 0; ) /* Copia i dati dal buffer curl nel nostro buffer */ memcpy((void *)&wr_buf, buffer, (size_t)segsize); /* Aggiorna l'indice di scrittura */ wr_index += segsize; /* Null termina il buffer */ wr_buf = 0; /* Restituisce il numero di byte ricevuti, indicando a curl che tutto è a posto */ return segsize; ) /* * Semplice applicazione curl per leggere il file index.html da un sito Web.* / int main(void) ( CURL *curl; CURLcode ret; int wr_error; wr_error = 0; wr_index = 0; /* Primo passo, init curl */ curl = curl_easy_init(); if (!curl) ( printf("couldn "t init curl\n"); restituire 0; ) /* Indica a curl l'URL del file che stiamo per recuperare */ curl_easy_setopt(curl, CURLOPT_URL, "www.exampledomain.com"); /* Indica a curl che riceveremo dati dalla funzione write_data, e * forniscigli anche un puntatore di contesto per il nostro errore di ritorno. */ curl_easy_setopt(curl, CURLOPT_WRITEDATA, (vuoto *)&wr_error); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); /* Consenti a curl di eseguire l'azione */ ret = curl_easy_perform(curl); printf("ret = %d (scrittura_errore = %d)\n", ret, wr_error); /* Emette la pagina se curl indica che non si sono verificati errori */ if (ret == 0) printf("%s\n", wr_buf); curl_easy_cleanup(curl); restituire 0; )

Nella parte superiore ci sono i file include necessari, incluso il file cURL di root. Successivamente, ho definito un paio di variabili da passare. Il primo, wr_buf , è il buffer in cui verrà scritto l'input. wr_index riflette l'indice della voce del buffer corrente.

Scendiamo alla funzione principale, che esegue l'installazione utilizzando una semplice API. Tutte le chiamate cURL passano attraverso un puntatore che memorizza lo stato di una particolare richiesta. È definito come riferimento al puntatore CURL. Questo esempio crea anche un codice di ritorno speciale chiamato CURLcode . Prima di utilizzare qualsiasi funzione libcurl, curl_easy_init deve essere chiamato per ottenere il puntatore CURL. Successivamente, nota diverse chiamate alla funzione curl_easy_setopt. Queste sono le impostazioni del puntatore per un'operazione specifica. Per queste chiamate vengono immessi un puntatore, un comando e un'opzione. Questo esempio utilizza innanzitutto l'istruzione CURLOPT_URL per specificare l'URL dei dati da recuperare. Questo è seguito da CURL_WRITEDATA per creare una variabile di contesto (nel nostro caso, la variabile di scrittura dell'errore interno). Infine, CURLOPT_WRITEFUNCTION definisce la funzione da chiamare in presenza di dati. L'API chiamerà questa funzione una o più volte con i dati che ha letto dal segnale di avvio.

Per avviare il trasferimento, chiama la funzione curl_easy_perform. Il suo compito è eseguire la trasmissione secondo una configurazione predefinita. Quando questa funzione viene chiamata, restituisce il risultato solo dopo un trasferimento riuscito o un errore. Gli ultimi elementi di main servono per passare gli stati restituiti, iniziare a leggere la pagina e infine ripulire con la funzione curl_easy_cleanup (al completamento dell'operazione).

Consideriamo ora la funzione write_data. Questa è una funzione di callback che viene chiamata quando vengono ricevuti i dati per una particolare operazione. Si noti che quando i dati vengono letti dal sito Web, vengono scritti sull'utente (write_data). La callback contiene un buffer (con i dati pronti), il numero di elementi e la loro dimensione (il loro prodotto fornisce la quantità totale di dati nel buffer) e un puntatore di contesto. Il primo compito è fornire una capacità di buffer sufficiente (wr_buf) per scrivere i dati. In caso contrario, imposta il puntatore di contesto e restituisce zero, indicando che c'è un problema. In caso contrario, copia i dati dal buffer cURL nel buffer e incrementa l'indice per puntare alla posizione di scrittura successiva. In questo esempio, la stringa viene terminata in modo che printf possa essere applicata ad essa in un secondo momento. Infine, restituisce a libcurl il numero di byte elaborati. Questo dice a libcurl che i dati sono stati accettati e possono essere rimossi. Questo è tutto: non è un modo semplice per leggere un file da un sito Web in memoria?

Client HTTP in Python

Questa sezione fornisce un esempio simile al client C HTTP, ma questa volta scritto in Python. Python è un utile linguaggio di scripting orientato agli oggetti, ottimo per la prototipazione e il software commerciale. L'esempio presuppone che tu abbia una certa conoscenza di Python, ma è usato pochissimo, quindi non è richiesta alcuna conoscenza avanzata.

Il codice per un semplice client HTTP, scritto in Python usando pycurl , è mostrato nel Listato 4.

Listato 4. Client HTTP Python che utilizza l'interfaccia pycurl di libcurl
import sys import pycurl wr_buf = "" def write_data(buf): global wr_buf wr_buf += buf def main(): c = pycurl.Curl() c.setopt(pycurl.URL, "http://www.exampledomain.com ") c.setopt(pycurl.WRITEFUNCTION, write_data) c.perform() c.close() main() sys.stdout.write(wr_buf)
Prototipazione in Python

Questo illustra uno dei vantaggi del linguaggio Python quando si tratta di prototipazione. Una funzionalità piuttosto ampia si ottiene con una piccola quantità di codice. Puoi ottenere prestazioni migliori in C, ma se il tuo obiettivo è generare rapidamente codice per testare un'idea, è meglio utilizzare linguaggi di scripting di alto livello come Python.

Questo codice è molto più semplice della versione C. Inizia importando i moduli necessari (il modulo standard sys system e il modulo pycurl). Successivamente, viene definito il buffer di scrittura (wr_buf). Come nel programma C, dichiaro la funzione write_data. Nota che questa funzione accetta un argomento: un buffer di dati letti dal server HTTP. Ho appena preso questo buffer e l'ho aggiunto al buffer di scrittura globale. La funzione principale inizia creando un puntatore Curl, quindi usa i metodi setopt per impostare l'URL e WRITEFUNCTION per scrivere. Chiama il metodo perform per avviare il trasferimento e chiude il puntatore. Infine, chiama la funzione principale e passa il buffer di scrittura a stdout . Si noti che in questo caso, il puntatore di errore di contesto non è necessario perché viene utilizzata la concatenazione di stringhe Python, il che significa che non è necessario utilizzare una stringa di dimensioni statiche.

Qual è il prossimo

Questo articolo sta solo grattando la superficie di libcurl dato l'enorme numero di protocolli e linguaggi supportati dalla libreria. Ma si spera che dimostri quanto sia facile creare applicazioni che utilizzano protocolli a livello di applicazione come HTTP. Il sito web di libcurl (vedi sezione ) contiene un gran numero di esempi e una notevole quantità di documentazione utile. Quindi la prossima volta che stai sviluppando un browser Web, uno spider o un'altra applicazione che richiede un protocollo a livello di applicazione, prova libcurl. Questo accelererà sicuramente il processo di sviluppo e ti divertirai.

Questo articolo presuppone che tu abbia familiarità con le basi della rete e del linguaggio HTML.

La capacità di scrivere script è essenziale per costruire un buon sistema informatico. L'estendibilità dei sistemi Unix attraverso script di shell e vari programmi che eseguono comandi automatizzati è uno dei motivi per cui hanno così tanto successo.

Il numero crescente di applicazioni che si stanno spostando sul web ha portato al fatto che il tema degli script HTTP sta diventando sempre più richiesto. Compiti importanti in quest'area sono l'estrazione automatica di informazioni da Internet, l'invio o il download di dati a server web, ecc.

Curl è uno strumento da riga di comando che ti consente di manipolare gli URL e passare vari tipi. Questo articolo è incentrato sulla creazione di semplici richieste HTTP. Si presume che tu sappia già dove chiamare

# curl --help

# curl --manual

per informazioni sull'arricciatura.

Curl non è uno strumento che farà tutto per te. Crea richieste, riceve dati e invia dati. Potrebbe essere necessario un po 'di "colla" per tenere tutto insieme, forse un linguaggio di scripting (come bash) o alcune chiamate manuali.

1. Protocollo HTTP

HTTP è il protocollo utilizzato per la ricezione di dati dai server web. È un protocollo molto semplice basato su TCP/IP. Il protocollo consente inoltre di inviare informazioni al server dal client utilizzando diversi metodi, come verrà mostrato di seguito.

HTTP sono stringhe di testo ASCII inviate da un client a un server per richiedere un'azione. Quando viene ricevuta una richiesta, il server risponde al client con diverse righe di testo di servizio e quindi con il contenuto effettivo.

Usando l'opzione curl -v, puoi vedere quali comandi curl invia al server, così come altro testo informativo. L'opzione -v è forse l'unico modo per eseguire il debug o addirittura comprendere l'interazione tra curl e il server web.

2.URL

Il formato URL (Uniform Resource Locator - indirizzo risorsa universale) specifica l'indirizzo di una specifica risorsa su Internet. Probabilmente lo sai, esempi di URL sono http://curl.haxx.se o https://yourbank.com.

3. Pagina Ottieni (OTTIENI).

La richiesta HTTP più semplice e comune consiste nell'ottenere il contenuto di un URL. L'URL può fare riferimento a una pagina Web, un'immagine o un file. Il client invia una richiesta GET al server e riceve il documento richiesto. Se esegui il comando

# curl http://curl.haxx.se

otterrai una pagina web visualizzata nella finestra del tuo terminale. Il documento HTML completo contenuto in questo URL.

Tutte le risposte HTTP contengono una serie di intestazioni che di solito sono nascoste. Per vederli insieme al documento stesso, usa l'opzione curl -i. Puoi anche richiedere solo le intestazioni con l'opzione -I (che forzerà curl a fare una richiesta HEAD).

4. Forme

I moduli sono il modo principale per presentare un sito Web come una pagina HTML con campi in cui l'utente inserisce i dati e quindi fa clic su un pulsante OK o Invia, dopodiché i dati vengono inviati al server. Il server utilizza quindi i dati ricevuti e decide come procedere: cercare le informazioni nel database, mostrare l'indirizzo inserito sulla mappa, aggiungere un messaggio di errore o utilizzare le informazioni per autenticare l'utente. Naturalmente, c'è qualche programma sul lato server che accetta i tuoi dati.

4.1 RICEVERE

Il modulo GET utilizza il metodo GET, in questo modo:

Se apri questo codice nel tuo browser, vedrai un modulo con una casella di testo e un pulsante che dice "OK". Se inserisci "1905" e fai clic su OK, il browser genererà un nuovo URL da seguire. L'URL sarà una stringa composta dal percorso dell'URL precedente e una stringa come "junk.cgi?birthyear=1905&press=OK".

Ad esempio, se il modulo si trova in "www.hotmail.com/when/birth.html", facendo clic sul pulsante OK si accederà all'URL "www.hotmail.com/when/junk.cgi?birthyear= 1905&premere=OK" .

La maggior parte dei motori di ricerca funziona in questo modo.

Per fare in modo che curl generi una richiesta GET, inserisci semplicemente ciò che ti aspetteresti dal modulo:

# curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"

4.2 POSTA

Il metodo GET fa sì che tutte le informazioni immesse vengano visualizzate nella barra degli indirizzi del browser. Questo può andare bene quando devi aggiungere una pagina ai segnalibri, ma è un evidente svantaggio quando inserisci informazioni segrete nei campi del modulo o quando la quantità di informazioni immesse nei campi è troppo grande (con conseguente URL illeggibile).

Il protocollo HTTP fornisce il metodo POST. Con esso, il client invia i dati separatamente dall'URL e quindi non li vedrai nella barra degli indirizzi.

Il form che genera la richiesta POST è simile al precedente:

Curl può formare una richiesta POST con gli stessi dati come segue:

# curl -d "birthyear=1905&press=%20OK%20" www.hotmail.com/when/junk.cgi

Questa richiesta POST utilizza "Content-Type application/x-www-form-urlencoded", che è il modo più utilizzato.

I dati che invii al server devono essere codificati correttamente, curl non lo farà per te. Ad esempio, se vuoi che i dati contengano uno spazio, devi sostituirlo con %20 e così via. La mancanza di attenzione a questo problema è un errore comune, a causa del quale i dati non vengono trasmessi come dovrebbero.

Già nel 1995 è stato definito un modo aggiuntivo per trasferire i dati su HTTP. È documentato in RFC 1867, motivo per cui a volte viene indicato come pubblicazione RFC1867.

Questo metodo è progettato principalmente per supportare meglio i caricamenti di file. Il modulo che consente all'utente di caricare un file è simile al seguente in HTML:

Si noti che il tipo di contenuto è impostato su multipart/form-data.

Per inviare dati a tale modulo utilizzando curl, immettere il comando:

# ricciolo -F [email protetta]-Fpress=OK

4.4 Campi nascosti

Un modo comune per comunicare le informazioni sullo stato nelle applicazioni HTML consiste nell'utilizzare i campi nascosti nei moduli. I campi nascosti non vengono compilati, sono invisibili all'utente e vengono passati allo stesso modo dei campi normali.

Un semplice esempio di modulo con un campo visibile, un campo nascosto e un pulsante OK:

Per inviare una richiesta POST con curl, non devi pensare se il campo è nascosto o meno. Per il riccio sono tutti uguali:

# curl -d "anno di nascita=1905&press=OK&person=daniel"

4.5 Scopri come appare una richiesta POST

Quando vuoi compilare un modulo e inviare dati al server usando curl, probabilmente vuoi che la richiesta POST assomigli esattamente a quella fatta usando il browser.

Un modo semplice per visualizzare la tua richiesta POST è salvare la pagina HTML del modulo su disco, cambiare il metodo in GET e premere il pulsante "Invia" (puoi anche cambiare l'URL a cui verranno inviati i dati).

Vedrai che i dati sono stati aggiunti all'URL, separati dai caratteri "?", come previsto quando si utilizzano i moduli GET.

5. METTI

Forse il modo migliore per caricare i dati su un server HTTP è usare PUT. Ancora una volta, ciò richiede un programma (script) sul back-end che sappia cosa fare e come accettare un flusso PUT HTTP.

Invia un file al server usando curl:

# curl -T file di caricamento www.uploadhttp.com/receive.cgi

6. Autenticazione

Autenticazione - passando un nome utente e una password al server, dopodiché controlla se hai il diritto di eseguire la richiesta richiesta. L'autenticazione di base (che curl utilizza per impostazione predefinita) è basata su testo in chiaro, il che significa che il nome utente e la password non verranno crittografati, ma solo leggermente "offuscati" con l'algoritmo Base64, lasciando possibile agli aggressori di scoprire queste informazioni lungo la strada tra te e il server HTTP.

Dì a curl di usare nome utente e password:

# curl -u nome:password www.secrets.com

Il sito potrebbe richiedere l'utilizzo di un diverso metodo di autenticazione (vedi cosa scrive il server negli header), in questi casi puoi usare le chiavi --ntlm, --digest, --negotiate o anche --anyauth. A volte l'accesso a server HTTP esterni avviene tramite un proxy, come spesso avviene nelle aziende e nelle aziende. Un proxy HTTP può richiedere il proprio nome utente e password per accedere a Internet. Chiave di arricciatura rilevante:

# curl -U utenteproxy:passwordproxy curl.haxx.se

Se il proxy richiede l'autenticazione NTLM, specificare --proxy-ntlm, se il metodo Digest, quindi --proxy-digest.

Se non specifichi una password nelle opzioni -u e -U, curl te la chiederà in modo interattivo.

Si noti che quando curl è in esecuzione, la stringa di esecuzione (e con essa le chiavi e le password) potrebbe essere visibile ad altri utenti del sistema nell'elenco delle attività. Ci sono modi per impedirlo. Altro su quello di seguito.

7. Referente

Una richiesta HTTP può includere un campo "referer" che indica l'URL da cui l'utente è arrivato a questa risorsa. Alcuni programmi/script controllano il campo "referer" e non eseguono la richiesta se l'utente proviene da una pagina sconosciuta. Sebbene questo sia un modo sciocco per controllare, molti script lo usano comunque. Con curl, puoi mettere qualsiasi cosa nel campo "referer" e quindi costringerlo a fare quello che vuoi.

Questo viene fatto nel modo seguente:

# curl -e http://curl.haxx.se daniel.haxx.se

8.Agente utente

Tutte le richieste HTTP supportano un campo "User-Agent" che specifica l'applicazione client dell'utente. Molte applicazioni Web utilizzano queste informazioni per visualizzare la pagina in un modo o nell'altro. I programmatori Web creano diverse versioni di una pagina per gli utenti di diversi browser al fine di migliorarne l'aspetto, utilizzare diversi script javascript, vbscript, ecc.

A volte potresti scoprire che curl restituisce una pagina che non è quella che hai visto nel tuo browser. In questo caso è proprio opportuno utilizzare il campo "User Agent" per ingannare ancora una volta il server.

Travesti curl da Internet Explorer su un computer Windows 2000:

# curl -A "Mozilla/4.0 (compatibile; MSIE 5.01; Windows NT 5.0)"

Perché non diventare Netscape 4.73 su una macchina Linux (PIII):

# curl -A "Mozilla/4.73 (X11; U; Linux 2.2.15 i686)"

9. Reindirizzamenti

In risposta alla tua richiesta, il server, al posto della pagina stessa, potrebbe restituire un'indicazione di dove dovrebbe andare il browser successivo per arrivare alla pagina desiderata. L'intestazione che dice al browser questo reindirizzamento è "Location:".

Per impostazione predefinita, curl non va all'indirizzo specificato in "Posizione:", ma semplicemente visualizza la pagina come al solito. Ma puoi inviarlo in questo modo:

# curl -L www.sitethatredirects.com

Se stai usando curl per inviare richieste a un sito che reindirizza immediatamente a un'altra pagina, puoi tranquillamente usare -L e -d/-F. Curl farà una richiesta POST per la prima pagina e poi una richiesta GET per quella successiva.

10. Biscotti

I cookie consentono ai browser Web di controllare lo stato sul lato client. Cookie è un nome con contenuto allegato. Il server, inviando i cookie, comunica al client il percorso e il nome host a cui inviare i cookie la prossima volta, indica la durata del cookie e alcuni altri parametri.

Quando un client si connette al server all'indirizzo specificato nel cookie ricevuto, il client invia quel cookie al server (se la durata non è scaduta).

Molte applicazioni e server utilizzano questo metodo per combinare più richieste in un'unica sessione logica. Affinché curl possa svolgere anche questa funzione, dobbiamo essere in grado di salvare e inviare cookie, proprio come fanno i browser.

Il modo più semplice per inviare un cookie al server durante il recupero di una pagina con curl è aggiungere l'opzione appropriata sulla riga di comando:

# curl -b "name=Daniel" www.cookiesite.com

I cookie vengono inviati come normali intestazioni HTTP. Ciò consente a curl di memorizzare i cookie memorizzando le intestazioni. Il salvataggio dei cookie con curl avviene con il comando:

# curl -D headers_and_cookies www.cookiesite.com

(a proposito, è meglio usare l'opzione -c per salvare i cookie, più su quello sotto).

curl ha un gestore di cookie completo che è utile quando vuoi connetterti di nuovo al server e utilizzare i cookie che hai salvato l'ultima volta (o creati a mano). Per utilizzare i cookie memorizzati in un file, chiama curl in questo modo:

# curl -b stored_cookies_in_file www.cookiesite.com

Il motore dei cookie curl viene abilitato quando si specifica l'opzione -b. Se vuoi che curl accetti solo i cookie, usa -b con un file che non esiste. Ad esempio, se vuoi che curl accetti i cookie da una pagina e poi segua un reindirizzamento (magari regalando il cookie che è stato appena accettato), puoi chiamare curl in questo modo:

# ricciolo -b nada -L www.cookiesite.com

Curl può leggere e scrivere cookie in formato Netscape e Mozilla. Questo è un modo conveniente per scambiare cookie tra browser e script automatici. L'opzione -b rileva automaticamente se un determinato cookie è un cookie dei browser specificati e lo gestisce di conseguenza, e utilizzando l'opzione -c/--cookie-jar puoi forzare curl a scrivere un nuovo cookie al termine dell'operazione:

# curl -b cookies.txt -c newcookies.txt www.cookiesite.com

11. HTTPS

Esistono diversi modi per proteggere le tue trasmissioni HTTP. Il protocollo più noto che risolve questo problema è HTTPS o HTTP su SSL. SSL crittografa tutti i dati inviati e ricevuti sulla rete, il che aumenta la probabilità che le tue informazioni rimangano segrete.

Curl supporta le richieste ai server HTTPS grazie alla libreria OpenSSL gratuita. Le richieste vengono effettuate secondo le consuete modalità:

# ricciolo https://that.secure.server.com

11.1 Certificati

Nel mondo HTTPS, oltre al nome utente e alla password, utilizzi i certificati per l'autenticazione. Curl supporta i certificati lato client. Tutti i certificati sono bloccati con una passphrase che devi inserire prima che curl possa iniziare a lavorare con essi. La passphrase può essere specificata sulla riga di comando o inserita in modo interattivo. I certificati in curl sono usati in questo modo:

# curl -E mycert.pem https://that.secure.server.com

Curl autentica anche il server verificando il certificato del server rispetto a uno archiviato localmente. Una mancata corrispondenza comporterà il rifiuto del ricciolo di connettersi. Per ignorare l'autenticazione, utilizzare l'opzione -k.

Ulteriori informazioni sui certificati sono disponibili all'indirizzo http://curl.haxx.se/docs/sslcerts.html.

12. Intestazioni di richieste arbitrarie

Potrebbe essere necessario modificare o aggiungere elementi di singole richieste di curl.

Ad esempio, puoi modificare la richiesta POST in PROPFIND e inviare i dati come "Content-Type: text/xml" (invece del solito Content-Type):

# ricciolo -d " " -H "Tipo di contenuto: testo/xml" -X PROPFIND url.com

Puoi rimuovere qualsiasi intestazione specificandola senza contenuto. Ad esempio, puoi rimuovere l'intestazione "Host:", rendendo così la richiesta "vuota":

# curl -H "Host:" http://mysite.com

Puoi anche aggiungere intestazioni. Il tuo server potrebbe aver bisogno di un'intestazione "Destinazione:":

# curl -H "Destinazione: http://moo.com/nowhere" http://url.com

13. Debug

Accade spesso che un sito risponda alle richieste curl in modo diverso rispetto alle richieste del browser. In questo caso, è necessario assimilare il più possibile curl al browser:

  • Utilizzare l'opzione --trace-ascii per salvare un rapporto dettagliato delle richieste in modo da poterle esaminare in dettaglio e comprendere il problema.
  • Assicurati di controllare la presenza di cookie e di usarli quando necessario (leggi -b switch e salva -c switch)
  • Specifica uno degli ultimi browser più diffusi nel campo "user-agent".
  • Compila il campo "referer" come fa il browser
  • Se stai utilizzando richieste POST, assicurati che tutti i campi siano passati nello stesso ordine del browser (vedi sopra, punto 4.5)

Un buon aiuto in questo difficile compito è il plug-in Mozilla/Firefox LiveHTTPHeader, che consente di visualizzare tutte le intestazioni che questo browser invia e riceve (anche quando si utilizza HTTPS).

Un approccio di livello più basso consiste nell'acquisire il traffico HTTP sulla rete utilizzando programmi come ethereal o tcpdump e quindi analizzare quali intestazioni sono state ricevute e inviate dal browser (HTTPS rende questo approccio inefficiente).

RFC 2616 è una lettura obbligatoria per chiunque voglia comprendere il protocollo HTTP.

RFC 2396 spiega la sintassi dell'URL.

RFC 2109 definisce come funzionano i cookie.

RFC 1867 definisce il formato del post di caricamento file.

http://openssl.planetmirror.com - home page del progetto OpenSSL

http://curl.haxx.se - homepage del progetto cURL

A cosa serve cURL?

  • cURL è ottimo per simulare le azioni dell'utente in un browser.

Un vero esempio pratico: è necessario riavviare il router (modem) per modificare l'indirizzo IP. Per fare ciò, è necessario: accedere al router, andare alla pagina di manutenzione e fare clic sul pulsante "Riavvia". Se questa azione deve essere eseguita più volte, la procedura deve essere ripetuta. D'accordo, non vuoi eseguire questa routine manualmente ogni volta. cURL ti consente di automatizzare tutto questo. Con pochi comandi cURL, puoi ottenere l'autorizzazione e completare l'attività sul router.

  • cURL è utile per ottenere dati da siti Web sulla riga di comando.

Un altro esempio pratico: vogliamo implementare la visualizzazione di statistiche generali per più siti. Se usi cURL, allora questo diventa un compito del tutto banale: usando cURL, ci autentichiamo sul servizio di raccolta delle statistiche (se richiesto), quindi (di nuovo, usando i comandi cURL) otteniamo le pagine necessarie, analizziamo i dati di cui abbiamo bisogno; la procedura viene ripetuta per tutti i nostri siti, quindi sommiamo e visualizziamo il risultato finale.

Quelli. I casi d'uso di cURL sono abbastanza reali, sebbene, nella maggior parte dei casi, i programmatori che lo usano per i loro programmi abbiano bisogno di cURL.

cURL supporta molti protocolli e metodi di autorizzazione, può trasferire file, funziona correttamente con i cookie, supporta certificati SSL, proxy e molto altro.

cURL in PHP e riga di comando

Possiamo usare cURL in due modi principali: negli script PHP e nella riga di comando.

Per abilitare cURL in PHP sul server, è necessario decommentare la riga nel file php.ini

Estensione=php_curl.dll

E quindi riavvia il server.

Su Linux, è necessario installare il pacchetto curl.

Su Debian, Ubuntu o Linux Mint:

$ sudo apt-get install curl

Su Fedora, CentOS o RHEL:

$ sudo yum install curl

Per vedere chiaramente la differenza di utilizzo in PHP e sulla riga di comando, eseguiremo le stesse attività due volte: prima in uno script PHP e poi sulla riga di comando. Cerchiamo di non confonderci.

Ottenere dati con cURL

Ottenere dati con cURL in PHP

Esempio PHP:

Tutto è molto semplice:

$url_destinazione- l'indirizzo del sito che ci interessa. Dopo l'indirizzo del sito, puoi inserire due punti e aggiungere l'indirizzo della porta (se la porta è diversa da quella standard).

curl_init- inizializza una nuova sessione e restituisce un handle, che nel nostro esempio è assegnato a una variabile $ch.

Quindi eseguiamo la richiesta cURL con la funzione curl_exec, a cui viene passato un descrittore come parametro.

Tutto è molto logico, ma quando questo script viene eseguito, il contenuto del sito verrà visualizzato sulla nostra pagina. Ma cosa succede se non si desidera visualizzare il contenuto, ma scriverlo in una variabile (per ulteriore elaborazione o analisi).

Aggiungiamo qualcosa al nostro script:

0) ( echo "errore curl: " . curl_error($ch); ) curl_close($ch); ?>

Abbiamo una linea curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);.

curl_setopt- imposta le opzioni. Un elenco completo delle opzioni può essere trovato in questa pagina: http://php.net/manual/en/function.curl-setopt.php

$dati_risposta = curl_exec($ch);

Ora il valore dello script è assegnato alla variabile $response_data, che può essere utilizzata per ulteriori operazioni. Ad esempio, puoi visualizzarne il contenuto.

If (curl_errno($ch) > 0) ( echo "curl error: " . curl_error($ch); )

vengono utilizzati per il debug in caso di errori.

Ottenere dati con cURL sulla riga di comando

Sulla riga di comando, digita

Curl mi-al.ru

dove invece di mi-al.ru- l'indirizzo del tuo sito.

Se è necessario copiare i dati in una variabile e non visualizzare il risultato sullo schermo, procedere come segue:

Temp=`curl mi-al.ru`

Tuttavia, alcuni dati vengono ancora visualizzati:

In modo che non vengano visualizzati, aggiungere la chiave -S:

Temp=`curl -s mi-al.ru`

Puoi vedere cosa è stato registrato:

eco $temp | meno

Autenticazione di base e HTTP

L'autenticazione, in poche parole, è l'introduzione di un nome utente e una password.

L'autenticazione di base è l'autenticazione del server. Per questo vengono creati due file: .htaccess e .htpasswd

Il contenuto del file .htaccess è qualcosa del genere

AuthName "Solo per utenti registrati!" AuthType Basic richiede l'utente valido AuthUserFile /home/freeforum.biz/htdocs/.htpassw

Il contenuto del file .htpasswd è qualcosa del genere:

Mial:CRdiI.ZrZQRRc

Quelli. login e password hash.

Quando provi ad accedere a una cartella protetta da password, il browser visualizzerà qualcosa del genere:

L'autenticazione HTTP è il caso in cui inseriamo un nome utente e una password in un modulo su un sito Web. È questa autenticazione che viene utilizzata durante l'immissione di posta, forum, ecc.

Autenticazione di base cURL (PHP)

Esiste un sito http://62.113.208.29/Update_FED_DAYS/ che richiede il login:

Proviamo il nostro script iniziale:

0) ( echo "errore curl: " . curl_error($ch); ) else ( echo $response_data; ) curl_close($ch); ?>

Sebbene lo script consideri che non ci siano errori, non ci piace affatto il risultato dell'output:

Aggiungiamo due righe:

curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "ru-board:ru-board");

Nella prima riga, impostiamo il tipo di autenticazione - basic. La seconda riga contiene il nome e la password separati da due punti (nel nostro caso, il nome e la password sono gli stessi - ru-board). Si è rivelato così:

0) ( echo "errore curl: " . curl_error($ch); ) else ( echo $response_data; ) curl_close($ch); ?>

Autenticazione cURL di base (sulla riga di comando)

Lo stesso può essere ottenuto sulla riga di comando con una riga:

Curl -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/

Non ho dimenticato di specificare il tipo di autenticazione, è solo che in cURL il tipo di autenticazione di base è quello predefinito.

Sulla riga di comando, tutto si è rivelato così rapidamente che, per frustrazione, ho scritto questo programma. Si collega al sito e scarica l'ultimo aggiornamento:

Temp=`curl -s -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/ | grep -E -o "Aggiorna_FED_201(1).(2).(2).7z" | uniq | coda -n 1`; curl -o $temp -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/$temp

È possibile aggiungere solo alcuni altri comandi:

  • decomprimere l'archivio nella directory specificata;
  • lancio degli aggiornamenti ConsultantPlus (questi sono aggiornamenti per lui);
  • è possibile implementare un controllo - se l'ultimo aggiornamento disponibile è già stato scaricato o se ne è apparso uno nuovo;
  • aggiungi tutto a Cron per gli aggiornamenti quotidiani.

Autenticazione HTTP cURL

cURL Autenticazione HTTP in PHP

Dobbiamo sapere:

  • indirizzo a cui inviare i dati per l'autenticazione
  • metodo di invio GET o POST
  • Accedere
  • parola d'ordine

A volte questi dati non sono sufficienti. Scopriamolo.

L'indirizzo a cui si desidera inviare i dati può essere ricavato dal modulo di autenticazione. Per esempio:

Guardiamo la proprietà azione. Quelli. la pagina finale è login.php. Abbiamo bisogno dell'indirizzo completo, come questo http://188.35.8.64:8080/login.php

Qui troviamo anche il metodo di invio: metodo = "post"

Conosco anche login e password: admin e qwerasdfzxcv

Per ogni evenienza, questo non è il mio router (e non so di chi), quindi se vuoi infastidirmi, non hai bisogno di pasticciare con questo router.

Quelli. una stringa viene passata al server dal modulo utilizzando il metodo POST. In teoria, il nostro script precedente, in cui abbiamo aggiunto una nuova riga, dovrebbe funzionare. Quelli. deve avvenire l'autenticazione.

0) ( echo "errore curl: " . curl_error($ch); ) else ( ) curl_close($ch); ?>

Nuova riga nello script

curl_setopt($ch, CURLOPT_POSTFIELDS, "LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv");

Qui curl_setopt- una funzione a noi già familiare per l'impostazione delle opzioni per cURL, CURLOPT_POSTFIELDSè il nome dell'opzione che stiamo impostando. CURLOPT_POSTFIELDS contiene tutti i dati inviati dal metodo POST. Bene, la linea stessa LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv- questi sono i dati che trasmettiamo.

Se esamini attentamente il modulo, puoi vedere che contiene anche campi nascosti. E i dati possono essere elaborati o integrati con JavaScript "s. Puoi studiare tutto questo, ma io preferisco il modo più semplice.

Sto usando Wireshark. Questo programma è progettato per sniffare (intercettare) il traffico. Ed è in esso che è molto conveniente vedere cosa viene trasmesso esattamente al sito.

Guarda questo piccolo video:

Quelli. con l'indirizzo dove vengono trasferiti i dati, ho indovinato. Ma la stringa trasmessa si è rivelata molto più complicata.

Ho inserito il parametro corretto e ho anche leggermente modificato lo script in modo che non solo accedesse, ma ricevesse anche qualcosa dal router:

0) ( echo "Errore arricciatura: " . curl_error($ch); ) else ( $target_url2 = "http://188.35.8.64:8080/bsc_wlan.php"; $ch2 = curl_init($target_url2); curl_setopt($ ch2, CURLOPT_RETURNTRANSFER, 1); $response_data2 = curl_exec($ch2); preg_match("|f.ssid.value = "(.*)";|", $response_data2, $results2); $results2 = str_replace("f .ssid.value = "", "", $risultati2); $risultati2 = str_replace("";", "", $risultati2); echo "Nome rete Wi-Fi: $risultati2
"; preg_match("|f_wpa.wpapsk1.value(.*)";|", $dati_risposta2, $risultati3); $risultati3 = str_replace("f_wpa.wpapsk1.value", "", $risultati3); $risultati3 = str_replace("="", "", $risultati3); $risultati3 = str_replace("";", "", $risultati3); echo "Password rete Wi-Fi: $risultati3"; ) curl_close($ch); ?>

A proposito, se il proprietario aggiorna la password (ma non aggiorna il firmware), la nuova password può sempre essere visualizzata all'indirizzo http://188.35.8.64:8080/model/__show_info.php?REQUIRE_FILE=/var/etc /hpasswd

(Questa è una vulnerabilità nota nei router D-Link DIR-300, D-Link DIR-320 e D-Link DAP-1353).

cURL Autenticazione HTTP sulla riga di comando

Conosciamo già l'indirizzo completo, così come la stringa da trasmettere. Pertanto, tutto è semplice:

Curl --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.php

Penso che sia tutto chiaro, perché abbiamo già considerato questi termini. Se qualcuno non è chiaro, chiedi nei commenti.

Un esempio di utilizzo di cURL per ottenere e analizzare i dati potrebbe essere il seguente set di comandi:

Curl -s --data "ACTION_POST=LOGIN&FILECODE=&VERIFICATION_CODE=&LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv&login=Log+In+&VER_CODE=" http://188.35.8.64:8080/login.php > /dev/null && echo -e "nn " && echo "Nome rete Wi-Fi" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f.ssid.value = "(.)*";" | sed "s/f.ssid.value = "//" | sed "s/";//" && echo "Password di rete Wi-Fi" && curl -s http://188.35.8.64:8080/bsc_wlan.php | grep -E "f_wpa.wpapsk1.(.)*";" | sed "s/f_wpa.wpapsk1.value//" | sed "s/";//" | sed "s/="//"

Casi di autorizzazione complessi: AJAX, JQuery, JavaScript, ecc.

Sarebbe più corretto scrivere i dati di intestazione in questo modo: Casi di autorizzazione "complessi". Quelli. metti la parola "complesso" tra virgolette. Sembrano complicati solo a prima vista, quando non è chiaro: dove avviene l'invio, quali sono i nomi dei campi, cosa viene inviato esattamente, ecc.

Ma, in realtà, si riducono tutti ai metodi POST o GET. Per capire cosa viene inviato esattamente, puoi salvare la pagina con il modulo sul tuo disco e appendere la funzione di visualizzazione dei dati generati per l'invio sul pulsante di invio. O anche più semplice - come me, Wireshark "ohm.

Se i dati sono corretti e l'autenticazione non si verifica, è necessario scavare nelle seguenti direzioni:

  • impostare la stringa di riferimento corretta
  • impostare la stringa dell'agente utente "corretta".

Tutto questo può essere fatto con i metodi cURL di base, ma non mi soffermerò su di esso. La lezione si è rivelata già grande, ma volevo anche mostrare un paio di trucchi con cURL.

Suggerimenti e trucchi cURL

cURL e ottenere cookie oltre a CURLOPT_COOKIEJAR

Penso che sia già diventato chiaro che cURL gestisce correttamente i cookie: li salva, li usa quando il server lo richiede, ecc. Ma a volte i cookie devono essere salvati. C'è un'opzione CURLOPT_COOKIEJAR per questo, ma non è sempre possibile usarla. Ecco di cosa tratta il nostro primo trucco.

A volte, a causa delle peculiarità delle impostazioni PHP sul server, opzioni come CURLOPT_COOKIEJAR (consente di salvare i cookie ricevuti in un file) e CURLOPT_COOKIEFILE (consente di utilizzare i cookie da un file) non sono disponibili per noi. Perché dicono che usando queste opzioni saremo in grado di estrarre qualsiasi file dal loro server. Ecco la soluzione a questo problema:

1) Non utilizzare CURLOPT_FOLLOWLOCATION

2) Usa curl_setopt($ch, CURLOPT_HEADER, 1)

3) Raccogliamo i cookie dall'intestazione in questo modo:

preg_match_all("|Set-Cookie: (.*);|U", $contenuto, $risultati); $cookie = implode(";", $risultati);

4) Impostali usando curl_setopt($ch, CURLOPT_COOKIE, $cookies);

Secondo consiglio. Da aggressori possiamo trasformarci in vittime. Per non diventare vittima di un attacco man-in-the-middle, lo facciamo.

Per favore a tutti, smettete di impostare CURLOPT_SSL_VERIFYPEER su false o 0. Se la vostra installazione PHP non ha un set aggiornato di certificati radice CA, scaricatene uno dal sito web curl e salvatelo sul vostro server:

Quindi imposta il percorso nel tuo file php.ini, ad esempio su Windows:

curl.cainfo=c:phpcacert.pem

La disabilitazione di CURLOPT_SSL_VERIFYPEER consente un attacco man-in-the-middle (MITM), che non vogliamo!

Bene, un ultimo consiglio per oggi. Sapevi che è possibile un gran numero di richieste di curl asincrone?

Per questo puoi usare curl_multi_init. Dettagli e codice di esempio nella documentazione ufficiale http://php.net/manual/ru/function.curl-multi-init.php

Informazioni su cURL sulla riga di comando

uomo-ricciolo

Anche la seconda parte della lezione è stata preparata per la lettura in russo cURL: " ".