Să ne perfecționăm abilitățile în lucrul cu cURL. Introducere în cURL

cURL este instrument special, care este conceput pentru a transfera fișiere și date folosind sintaxa URL. Această tehnologie acceptă multe protocoale, cum ar fi HTTP, FTP, TELNET și multe altele. cURL a fost conceput inițial pentru a fi un instrument de linie de comandă. Din fericire pentru noi, biblioteca cURL este acceptată de limbaj Programare PHP. În acest articol ne vom uita la unele dintre caracteristicile avansate ale cURL și, de asemenea, vom acoperi aplicare practică cunoștințe dobândite folosind PHP.

De ce cURL?

De fapt, sunt multe moduri alternative mostre de conținut de pagini web. În multe cazuri, în principal din cauza lenei, am folosit simplu Funcții PHPîn loc de cURL:

$content = file_get_contents("http://www.nettuts.com"); // sau $linii = fisier("http://www.nettuts.com"); // sau readfile ("http://www.nettuts.com");

Cu toate acestea, aceste funcții practic nu au flexibilitate și conțin un număr mare de deficiențe în ceea ce privește gestionarea erorilor etc. În plus, există anumite sarcini pe care pur și simplu nu le poți rezolva cu acestea funcții standard: interacțiune cu cookie-uri, autentificare, trimitere formular, încărcare fișier etc.

cURL este o bibliotecă puternică care acceptă multe protocoale, opțiuni și oferă diferite informatii detaliate despre solicitările URL.

Structura de bază

  • Inițializare
  • Atribuirea parametrilor
  • Rezultatul execuției și preluarea
  • Eliberarea memoriei

// 1. initializare $ch = curl_init(); // 2. specificați parametrii, inclusiv url curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. obține HTML ca rezultat $output = curl_exec($ch); // 4. închide conexiunea curl_close($ch);

Pasul #2 (adică apelarea curl_setopt()) va fi discutat mult mai mult în acest articol decât toți ceilalți pași, deoarece În această etapă, se întâmplă toate cele mai interesante și utile lucruri pe care trebuie să le știi. În cURL există un număr mare de opțiuni diferite care trebuie specificate pentru a putea configura solicitarea URL în cel mai atent mod. Nu vom lua în considerare întreaga listă, ci ne vom concentra doar pe ceea ce consider necesar și util pentru această lecție. Puteți studia singur orice altceva dacă acest subiect vă interesează.

Verificarea erorilor

În plus, puteți utiliza, de asemenea, instrucțiuni condiționale pentru a testa dacă o operațiune s-a finalizat cu succes:

// ... $ieșire = curl_exec($ch); if ($ieșire === FALSE) ( echo "cURL Error: " . curl_error($ch); ) // ...

Aici vă rog să notați pentru dvs. foarte punct important: Ar trebui să folosim „=== false” pentru comparație în loc de „== false”. Pentru cei care nu cunosc, acest lucru ne va ajuta să distingem între un rezultat gol și o valoare booleană falsă, ceea ce va indica o eroare.

Obținerea de informații

Un alt pas suplimentar este obținerea datelor despre cererea cURL după ce aceasta a fost executată.

// ... curl_exec($ch); $info = curl_getinfo($ch); ecou „Luat” . $info["total_time"] . „secunde pentru url”. $info["url"]; //...

Matricea returnată conține următoarele informații:

  • "url"
  • „tip_conținut”
  • „http_code”
  • „header_size”
  • „request_size”
  • "filetime"
  • „ssl_verify_result”
  • „redirect_count”
  • „total_time”
  • „namelookup_time”
  • „connect_time”
  • „pretransfer_time”
  • „size_upload”
  • „size_download”
  • „viteză_descărcare”
  • „speed_upload”
  • „download_content_length”
  • „încărcare_conținut_lungime”
  • „starttransfer_time”
  • „redirect_time”

Detectarea redirecționării în funcție de browser

În acest prim exemplu, vom scrie cod care poate detecta redirecționările URL pe baza diverse setari browser. De exemplu, unele site-uri web redirecționează browserele unui telefon mobil sau ale oricărui alt dispozitiv.

Vom folosi opțiunea CURLOPT_HTTPHEADER pentru a defini antetele noastre HTTP de ieșire, inclusiv numele browserului utilizatorului și limbi disponibile. În cele din urmă, vom putea determina ce site-uri ne redirecționează către adrese URL diferite.

// testează URL-ul $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // testarea browserelor $browsers = array("standard" => array ("user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5) .6 (.NET CLR 3.5.30729)", "language" => "en-us,en;q=0.5"), "iphone" => array ("user_agent" => "Mozilla/5.0 (iPhone; U); ; CPU ca Mac OS X en) AppleWebKit/420+ (KHTML, ca Gecko) Versiune/3.0 Mobile/1A537a Safari/419.3", "language" => "en"), "franceză" => array ("user_agent" => "Mozilla/4.0 (compatibil; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "limba" => "fr,fr-FR;q=0.5"); foreach ($urls ca $url) ( echo "URL: $url\n"; foreach ($browsers ca $test_name => $browser) ( $ch = curl_init(); // specificați adresa URL curl_setopt($ch, CURLOPT_URL , $url); // se specifică antetele pentru browser curl_setopt($ch, CURLOPT_HTTPHEADER, array("User-Agent: ($browser["user_agent"])", "Accept-Language: ($browser["language"] )" )); // nu avem nevoie de conținutul paginii curl_setopt($ch, CURLOPT_NOBODY, 1); // trebuie să obținem antete HTTP curl_setopt($ch, CURLOPT_HEADER, 1); // returnăm rezultate în loc de ieșire curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); , $matches) ( echo " $test_name: redirecționează către $matches\n"; ) else ( echo "$test_name: no redirection\n"; ) ) echo "\n\n" )

Mai întâi, specificăm o listă de adrese URL ale site-urilor pe care le vom verifica. Mai exact, avem nevoie de adresele acestor site-uri. În continuare, trebuie să definim setările browserului pentru a testa fiecare dintre aceste adrese URL. După aceasta, vom folosi o buclă în care vom parcurge toate rezultatele obținute.

Trucul pe care îl folosim în acest exemplu pentru a seta setările cURL ne va permite să obținem nu conținutul paginii, ci doar anteturile HTTP (stocate în $output). Apoi, folosind o regex simplă, putem determina dacă șirul „Locație:” a fost prezent în anteturile primite.

Când rulați acest cod, ar trebui să obțineți ceva de genul acesta:

Crearea unei cereri POST la o anumită adresă URL

La formare cerere GET Datele transmise pot fi transmise la adresa URL printr-un „șir de interogare”. De exemplu, când efectuați o căutare pe Google, termenul de căutare este plasat în bara de adrese a noii adrese URL:

Http://www.google.com/search?q=ruseller

Pentru a simula această cerere, nu trebuie să utilizați facilitățile cURL. Dacă lenea te învinge complet, folosește funcția „file_get_contents()” pentru a obține rezultatul.

Dar chestia este că unele formulare HTML trimit solicitări POST. Datele din aceste forme sunt transportate prin corp Solicitare HTTP, și nu ca în cazul precedent. De exemplu, dacă ați completat un formular pe un forum și ați făcut clic pe butonul de căutare, atunci cel mai probabil va fi făcută o solicitare POST:

Http://codeigniter.com/forums/do_search/

Putem scrie un script PHP care poate simula acest tip de solicitare URL. Mai întâi să creăm un fișier simplu de acceptat și afișat Date POST. Să-i spunem post_output.php:

Print_r($_POST);

Apoi creăm un script PHP pentru a face cererea cURL:

$url = "http://localhost/post_output.php"; $post_data = array ("foo" => "bar", "query" => "Nettuts", "action" => "Submit"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // indică faptul că avem o cerere POST curl_setopt($ch, CURLOPT_POST, 1); // adaugă variabile curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $ieșire = curl_exec($ch); curl_close($ch); echo $ieșire;

Când rulați acest script, ar trebui să obțineți un rezultat ca acesta:

Astfel, cererea POST a fost trimisă către scriptul post_output.php, care la rândul său scoate matricea superglobală $_POST, al cărui conținut l-am obținut folosind cURL.

Încărcarea unui fișier

Mai întâi, să creăm un fișier pentru a-l genera și a-l trimite în fișierul upload_output.php:

Print_r($_FILES);

Și iată codul de script care realizează funcționalitatea de mai sus:

$url = "http://localhost/upload_output.php"; $post_data = matrice ("foo" => "bar", // fișier pentru a încărca "upload" => "@C:/wamp/www/test.zip"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $ieșire = curl_exec($ch); curl_close($ch); echo $ieșire;

Când doriți să încărcați un fișier, tot ce trebuie să faceți este să îl transmiteți ca o variabilă post normală, precedată de simbolul @. Când rulați scriptul scris, veți obține următorul rezultat:

CURL multiple

Una dintre cele mai multe punctele forte cURL este capacitatea de a crea „mai multe” handlere cURL. Acest lucru vă permite să deschideți o conexiune la mai multe adrese URL simultan și asincron.

În versiunea clasică a cererii cURL, execuția scriptului este suspendată și așteaptă finalizarea operației de solicitare URL, după care scriptul poate continua. Dacă intenționați să interacționați cu o mulțime de adrese URL, aceasta va duce la o investiție destul de semnificativă de timp, deoarece în versiunea clasică puteți lucra doar cu o singură adresă URL la un moment dat. Cu toate acestea, îl putem repara această situație, folosind manipulari speciali.

Să ne uităm la exemplul de cod pe care l-am luat de la php.net:

// creează mai multe resurse cURL $ch1 = curl_init(); $ch2 = curl_init(); // specificați URL-ul și alți parametri curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); curl_setopt($ch2, CURLOPT_HEADER, 0); //creez un handler cURL multiplu $mh = curl_multi_init(); //adăugați mai mulți handlere curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $activ = nul; //execuți do ($mrc ​​= curl_multi_exec($mh, $activ); ) while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($activ && $mrc ​​​​== CURLM_OK) ( dacă (curl_multi_select($mh) != -1) ( do ( $mrc ​​​​= curl_multi_exec($mh, $activ); ) while ($mrc == CURLM_CALL_MULTI_PERFORM) ) //închidere curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

Ideea este că puteți utiliza mai mulți handlere cURL. Folosind o buclă simplă, puteți urmări ce solicitări nu au fost încă finalizate.

Există două bucle principale în acest exemplu. Primul bucla do-while apelează funcția curl_multi_exec(). Această funcție nu este blocabilă. Acesta rulează cât de repede poate și returnează starea cererii. Atâta timp cât valoarea returnată este constanta „CURLM_CALL_MULTI_PERFORM”, aceasta înseamnă că lucrarea nu a fost încă finalizată (de exemplu, în în acest moment Antetele HTTP sunt trimise la adresa URL); De aceea continuăm să verificăm această valoare returnată până când obținem un rezultat diferit.

În bucla următoare verificăm condiția în timp ce variabila $activ = „adevărat”. Este al doilea parametru al funcției curl_multi_exec(). Valoarea acestei variabile va fi „adevărată” atâta timp cât oricare dintre modificările existente este activă. Apoi apelăm funcția curl_multi_select(). Execuția acestuia este „blocata” cât timp există cel puțin o conexiune activă, până când se primește un răspuns. Când se întâmplă acest lucru, ne întoarcem la bucla principală pentru a continua să executăm interogări.

Acum să aplicăm ceea ce am învățat la un exemplu pentru care va fi cu adevărat util cantitate mare oameni.

Verificarea linkurilor în WordPress

Imaginați-vă un blog cu o sumă imensă postări și mesaje, fiecare dintre acestea conținând link-uri către internet extern resurse. Unele dintre aceste link-uri ar putea fi deja moarte din diverse motive. Este posibil ca pagina să fi fost ștearsă sau este posibil ca site-ul să nu funcționeze deloc.

Vom crea un script care va analiza toate linkurile și va găsi site-uri web care nu se încarcă și 404 pagini, apoi ne va furniza un raport detaliat.

Permiteți-mi să spun imediat că acesta nu este un exemplu de creare a unui plugin pentru WordPress. Acesta este un teren de testare absolut bun pentru testele noastre.

Să începem în sfârșit. Mai întâi trebuie să preluăm toate linkurile din baza de date:

// configurare $db_host = "localhost"; $db_user = „rădăcină”; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "www.mydomain.com"); $max_connections = 10; // inițializarea variabilelor $url_list = array(); $working_urls = array(); $dead_urls = array(); $not_found_urls = array(); $activ = nul; // se conectează la MySQL dacă (!mysql_connect($db_host, $db_user, $db_pass)) ( die("Nu s-a putut conecta: " . mysql_error()); ) if (!mysql_select_db($db_name)) ( die("Poate not select db: " . mysql_error()); ) // selectează toate postările publicate cu link-uri $q = "SELECTează post_content FROM wp_posts WHERE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post"" ; $r = mysql_query($q) sau die(mysql_error()); while ($d = mysql_fetch_assoc($r)) ( // preia link-uri folosind expresii regulate if (preg_match_all("!href=\"(.*?)\"!", $d["post_content"], $potriviri)) ( foreach ($potrivește ca $url) ( $tmp = parse_url($url) ; if (in_array($tmp["gazdă"], $excluded_domains)) (continuare; ) $url_list = $url) ) // eliminați duplicatele $url_list = array_values(array_unique($url_list)); if (!$url_list) ( die("Fără URL de verificat"); )

Mai întâi, generăm date de configurare pentru interacțiunea cu baza de date, apoi scriem o listă de domenii care nu vor participa la verificare ($excluded_domains). De asemenea, definim un număr care caracterizează numărul maxim de conexiuni simultane pe care le vom folosi în scriptul nostru ($max_connections). Apoi ne alăturăm bazei de date, selectăm postările care conțin link-uri și le acumulăm într-o matrice ($url_list).

Următorul cod este puțin complicat, așa că parcurgeți-l de la început până la sfârșit:

// 1. handler multiplu $mh = curl_multi_init(); // 2. adăugați un set de adrese URL pentru ($i = 0; $i< $max_connections; $i++) { add_url_to_multi_handle($mh, $url_list); } // 3. инициализация выполнения do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 4. основной цикл while ($active && $mrc == CURLM_OK) { // 5. если всё прошло успешно if (curl_multi_select($mh) != -1) { // 6. делаем дело do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 7. если есть инфа? if ($mhinfo = curl_multi_info_read($mh)) { // это значит, что запрос завершился // 8. извлекаем инфу $chinfo = curl_getinfo($mhinfo["handle"]); // 9. мёртвая ссылка? if (!$chinfo["http_code"]) { $dead_urls = $chinfo["url"]; // 10. 404? } else if ($chinfo["http_code"] == 404) { $not_found_urls = $chinfo["url"]; // 11. рабочая } else { $working_urls = $chinfo["url"]; } // 12. чистим за собой curl_multi_remove_handle($mh, $mhinfo["handle"]); // в случае зацикливания, закомментируйте acest apel curl_close($mhinfo[„mâner”]);

// 13. adăugați o nouă adresă URL și continuați să lucrați dacă (add_url_to_multi_handle($mh, $url_list)) ( do ( $mrc ​​​​= curl_multi_exec($mh, $active); ) while ($mrc == CURLM_CALL_MULTI_PERFORM); ) ) ) ) // 14. completare curl_multi_close($mh); echo "==Adrese URL moarte==\n"; echo implode("\n",$dead_urls) . „\n\n”; echo „==404 URL-uri==\n”; echo implode("\n",$not_found_urls) . „\n\n”; echo "==Adrese URL de lucru==\n"; echo implode("\n",$working_urls); function add_url_to_multi_handle($mh, $url_list) ( static $index = 0; // dacă avem mai multe URL-uri care trebuie preluate dacă ($url_list[$index]) ( // new curl handler $ch = curl_init(); // specifica url curl_setopt($ch, CURLOPT_URL, $url_setopt($ch, CURLOPT_RETURNTRANSFER, 1 curl_setopt, CURLOPT_FOLLOWLOCATION, 1 ($ch, CURL); $mh, $ch // mergeți la următoarea url $index++ return true ( // adăugarea de noi URL-uri este finalizată; ) )

  1. Aici voi încerca să explic totul în detaliu. Numerele din listă corespund numerelor din comentariu.
  2. 1. Creați un handler multiplu;
  3. 2. Vom scrie funcția add_url_to_multi_handle() puțin mai târziu. De fiecare dată când este apelat, va începe procesarea unei noi adrese URL. Inițial, adăugăm 10 ($max_connections) URL-uri;
  4. 3. Pentru a începe, trebuie să rulăm funcția curl_multi_exec(). Atâta timp cât returnează CURLM_CALL_MULTI_PERFORM, mai avem ceva de făcut. Avem nevoie de asta în principal pentru a crea conexiuni;
  5. 4. Urmează bucla principală, care va rula atâta timp cât avem cel puțin o conexiune activă;
  6. 6. Încă o dată, trebuie să facem cURL să lucreze, și anume să preluăm datele răspunsului returnat;
  7. 7. Informațiile sunt verificate aici. Ca urmare a executării cererii, va fi returnată o matrice;
  8. 8. Matricea returnată conține un handler cURL. Îl vom folosi pentru a selecta informații despre o solicitare separată de cURL;
  9. 9. Dacă linkul era mort sau scriptul a expirat, atunci nu ar trebui să căutăm niciunul codul http O;
  10. 10. Dacă linkul ne-a returnat o pagină 404, atunci codul http va conține valoarea 404;
  11. 11. B altfel, avem o legătură de lucru în fața noastră. (Puteți adăuga verificări suplimentare la codul de eroare 500, etc...);
  12. 12. În continuare eliminăm handlerul cURL pentru că nu mai avem nevoie de el;
  13. 13. Acum putem adăuga o altă adresă URL și rula tot ce am vorbit înainte;
  14. 14. La acest pas, scriptul își finalizează munca. Putem elimina tot ce nu avem nevoie și putem genera un raport;
  15. 15. În cele din urmă, vom scrie o funcție care va adăuga url la handler. Variabila statică $index va fi incrementată de fiecare dată când această funcție este apelată.

Am folosit acest script pe blogul meu (cu câteva link-uri rupte pe care le-am adăugat intenționat pentru a-l testa) și am obținut următorul rezultat:

În cazul meu, scriptul a durat puțin mai puțin de 2 secunde pentru a se accesa cu crawlere prin 40 de adrese URL. Creșterea productivității este semnificativă atunci când lucrați cu mai mulți un număr mare adrese URL. Dacă deschideți zece conexiuni în același timp, scriptul se poate executa de zece ori mai repede.

Câteva cuvinte despre alte opțiuni utile de cURL

Autentificare HTTP

Dacă este pornit adresa URL Dacă aveți autentificare HTTP, puteți utiliza cu ușurință următorul script:

$url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // specificam numele de utilizator si parola curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // dacă redirecționarea este permisă curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // apoi salvăm datele noastre în cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $ieșire = curl_exec($ch); curl_close($ch);

Încărcare FTP

PHP are, de asemenea, o bibliotecă pentru lucrul cu FTP, dar nimic nu vă împiedică să utilizați instrumentele cURL aici:

// deschide fisierul $fisier = fopen("/cale/la/fisier", "r"); // URL-ul ar trebui să conțină următorul conținut $url = "ftp://nume utilizator: [email protected]:21/path/to/new/file"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, file size("/path/to/file"); ); curl_close($ch);

Folosind Proxy

Puteți efectua solicitarea URL printr-un proxy:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // specifica adresa curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // dacă trebuie să furnizați un nume de utilizator și o parolă curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $ieșire = curl_exec($ch); curl_close($ch);

Funcții de apel invers

De asemenea, este posibil să specificați o funcție care va fi declanșată chiar înainte de finalizarea cererii cURL. De exemplu, în timp ce conținutul răspunsului se încarcă, puteți începe să utilizați datele fără a aștepta să se încarce complet.

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://net.tutsplus.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"funcție_progres"); curl_exec($ch); curl_close($ch); function progress_function($ch,$str) ( echo $str; return strlen($str); )

O funcție ca aceasta TREBUIE să returneze lungimea șirului, ceea ce este o cerință.

Concluzie

Astăzi am învățat cum puteți utiliza biblioteca cURL în dvs în scopuri egoiste. Sper că v-a plăcut acest articol.

Multumesc! O zi plăcută!

16.02.2006 Jeff Felling

Curl vă va ajuta să gestionați datele găzduite pe Web. Acest articol discută despre instrumentul gratuit Curl, care poate fi utilizat pentru a trimite și primi pagini Web din linia de comandă. Curl facilitează automatizarea multora

Curl vă va ajuta să vă gestionați datele de pe Web

Acest articol acoperă un instrument gratuit numit Curl, care vă permite să trimiteți și să primiți pagini Web din linia de comandă. Curl facilitează automatizarea multor operațiuni securitatea informatieiși administrare, cum ar fi extragerea unei pagini Web pentru analiză sau descărcarea unui patch de securitate de pe Web.

Instalare curl

Curl este inclus cu multe distribuții Unix. Binare și surse disponibile pentru majoritatea celorlalți sisteme de operare. Chiar și programatorii cu care lucrează deschide PHP, poate folosi Curl pentru acces securizat la conținut web direct din scripturi PHP.

Curl necesită pachetul OpenSSL pentru a funcționa cu site-urile Web Secure Sockets Layer (SSL). Există două versiuni de Curl: una cu SSL și una fără SSL. Îl recomand pe primul, deoarece SSL protejează datele în mod fiabil.

Înainte de a putea folosi Curl cu funcționalitatea SSL, trebuie să descărcați și să instalați separat pachetul OpenSSL. Binarele OpenSSL pentru Windows pot fi descărcate de pe site-ul proiectului GnuWin32 SourceForge la . Există multe alte instrumente utile pe acest site care au fost portate pe Windows.

Ar trebui să descărcați și să instalați pachetul OpenSSL, apoi să copiați cele două fișiere DLL în directorul system32:

Copiați „C:Program FilesGnuWin32 binlibeay32.dll” %windir%system32 copiați „C:Program FilesGnuWin32 binlibssl32.dll” %windir%system32

După aceasta, puteți instala Curl. Binarele Curl compatibile cu SSL pentru Windows pot fi găsite la http://curl.haxx.se/latest.cgi?curl=win32-ssl-sspi . Ultima versiune, curl 7.15.0, este în win32-ssl-sspi.zip, care conține curl.exe și documentația.

După instalarea Curl, ar trebui să vă asigurați că funcționează introducând comanda

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

Dacă pe ecran apare un cuvânt de culoare (de exemplu, verde), Curl funcționează. In aceasta exemplu simplu Curl preia conținutul Infocon de pe site-ul Internet Storm Center al Institutului SANS. Verde înseamnă că Internetul funcționează normal și nu au fost detectate amenințări serioase. Dacă în loc de verde, cuvintele galben, portocaliu sau roșu apar pe ecran, atunci lăsați acest articol deoparte și vizitați site-ul web http://isc.sans.org pentru a afla despre condițiile cu risc ridicat de pe Internet. Dacă apare o eroare, trebuie să verificați dacă Curl este instalat corect.

În esență, Curl preia o pagină Web și apoi scoate originalul text HTML pagini către consolă. Cu toate acestea, capacitățile utilitarului sunt mai largi. Curl are încorporat verificarea erorilor. De exemplu, comanda

Curl http://noserverhere

dă o eroare Curl: (6) Nu s-a putut rezolva gazda: noserverhere; Gazda nu a fost găsită. Codurile de eroare pot fi folosite în scripturi pentru a testa disponibilitatea unei pagini Web sau capacitatea de răspuns a serverului Web. De exemplu, dacă utilizați Curl pentru a prelua o pagină Web în fiecare zi, în special statisticile zilnice ale site-ului Web, puteți mări scriptul cu cod sursă care caută coduri de eroare. Dacă Curl emite codul de eroare Curl: (7) nu s-a putut conecta la gazdă, puteți emite imediat un avertisment sau puteți trimite un e-mail.

Extragerea datelor criptate

Unul dintre cele mai importante avantaje ale Curl este compatibilitatea cu SSL. Solicitat Pagini HTTPS transmis prin rețea în formă criptată, apoi Curl afișează textul recuperat pe ecran. Curl verifică, de asemenea, certificatele - data de expirare a certificatului, dacă numele gazdei se potrivește cu numele gazdei din certificat și nivelul de încredere al certificatului. certificat rădăcină- și avertizează dacă certificatul este incorect. Opțiunea -cacert vă permite să specificați un anumit fișier de certificat. Verificarea certificatelor este dezactivată folosind opțiunea -k. O abordare alternativă este utilizarea opțiunii -insecure.

Nu numai pentru WWW

Capacitățile lui Curl depășesc simpla trimitere de fișiere prin Internet. Folosind Curl, puteți lista rapid directoarele unui site FTP:

Curl ftp://myftpsite

Pentru a vedea subdirectoarele site-ului, introduceți comanda

Curl ftp://myftpsite/subdir/

Pentru a descărca un fișier de pe Internet, trebuie doar să specificați numele fișierului în adresa URL. Următorul exemplu încarcă un fișier numit readme.txt direct din linia de comandă și îl afișează pe ecran:

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

Este adesea mai ușor să pregătiți un script cu Curl pentru a introduce fișiere FTP decât să îl utilizați Comanda FTP interactiv.

În mod implicit, datele sunt transmise direct în consolă, dar pot fi redirecționate către un fișier folosind opțiunile -o și -O. Pentru a obține pagina și a o salva pe disc, trebuie să specificați opțiunea -o. Opțiunea -O salvează pagina rezultată în fișier local, iar Curl preia numele document șters. Dacă adresa URL nu include un nume de fișier, această operațiune va eșua. Dacă utilizați Curl pentru a trimite o solicitare către un site Web fără nume de fișier, dar doriți să stocați rezultatul într-un fișier, puteți specifica numele fișierului în linie de comandă, De exemplu:

Autentificare

Curl oferă metode de autentificare Basic, Digest și Integrated. Pe majoritatea site-urilor, paginile de autentificare pe bază de formulare pot fi accesate folosind funcțiile de trimitere ale Curl, așa cum va fi demonstrat mai jos. Aceasta înseamnă că puteți trimite date de formular, cum ar fi numele de utilizator și parola, către un site Web la distanță care vă solicită să introduceți informații pe pagina sa Web. Puteți folosi opțiunea -u pentru a redirecționa acreditările sau le puteți lipi în URL, așa cum se face în mod tradițional în FTP, de exemplu:

Curl ftp://nume utilizator: parola@myhtmlsite

Folosind Curl, tehnicile împrumutate de la FTP pot fi transferate pe HTTP, ca în exemplul următor:

Curl http://username:parola @myhtmlsite/default.htm

Curl oferă, de asemenea, acces la paginile Web printr-un server proxy. Prin urmare, Curl poate fi configurat să utilizeze un server proxy pentru autentificare în modurile Basic, Digest și NTLM.

Citiți documentația

Într-un articol este dificil să acoperim toate numeroasele funcții ale Curl, inclusiv încărcarea fișierelor pe server (-T) și vizualizarea doar a informațiilor din antetul HTTP (-I) și vizualizarea tuturor datelor în modul detaliat (-V ), și ieșire ascunsă(-s). Vă recomand să aruncați o privire mai atentă la caracteristicile lui Curl în tutorialul postat la http://curl.haxx.se/docs .

Exemplu de utilizare a buclelor

Acum că am învățat elementele de bază ale Curl, să ne uităm la un exemplu simplu de preluare a datelor de pe un site Web, având în vedere unele informații. Să construim un instrument Whois simplu care să demonstreze simplitatea și ușurința de utilizare a Curl și procedura de trimitere a datelor către un site Web folosind parametrul -d. În acest exemplu, Curl trimite adresa IP către site-ul web Arin Whois și apoi preia rezultatele de pe acel site. Whois caută informații despre proprietarul unei adrese IP.

Este important să cercetați site-ul Web înainte de a începe, deoarece codul sursă al fiecărui site este diferit și Curl nu funcționează întotdeauna la fel pe fiecare site. O vizită preliminară a site-ului vă permite să colectați informatiile necesare pentru ca Curl să funcționeze. În acest exemplu, am folosit un browser pentru a vizita un site Web http://www.arin.net/whois/, și a observat că site-ul are un singur câmp de introducere a datelor în care vizitatorii indică adresa IP de care sunt interesați. Trebuie să obțineți detaliile acestui câmp, care face parte dintr-un formular Web. Acest exemplu folosește scriptul Perl formfind.pl ( http://cool.haxx.se/cvs.cgi/curl/perl/contrib/formfind?rev=HEAD&content-type=text/vnd.viewcvs-markup). Scriptul Formfind.pl convertește datele formularului în rezultate utile și simplifică căutare manuală date în HTML. Desigur, Perl trebuie să fie implementat pe computer pentru a rula Formfind. Frumos pachet Win32 Perl poate fi comandat de pe site-ul ActiveState ActivePerl la http://www.activestate.com .

Să privim exemplul mai detaliat. Mai întâi, să ne uităm la un site Web care conține un formular care solicită informații:

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

Această comandă preia pagina Whois de la http://www.arin.net și o salvează în fișier text whoisOutputFile, care conține textul sursă HTML care este redat de browser atunci când site-ul este vizitat.

Apoi trebuie să găsiți și să selectați datele din formular:

./formfind.pl

Formfind returnează variabile de formăși posibilele lor valori. În acest exemplu, rezultatele rezultatelor sunt destul de simple (vezi. ecranul 1).

Ar trebui să fiți atenți la date Formulare de intrare numit queryinput. Acesta este câmpul de text pe care Curl ar trebui să-l trimită adresa IP pe care o căutați. Adresa IP specifică nu contează - în acest exemplu a fost folosită adresa Microsoft. Folosind parametrul -d, adresa IP căutată este redirecționată către câmpul de intrare a interogării:

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

Comanda Curl cu opțiunea -d caută date în formular, în în acest caz, queryinput, care reprezintă adresa IP pe care o căutați. În acest caz, adresa țintă se modifică; formularul ar trebui să trimită date la o nouă adresă URL care reprezintă scriptul whois.pl. Noua adresă țintă poate fi văzută în rezultatul formfind din Ecranul 1.

Acest exemplu preia și textul HTML original al răspunsului Whois, dar este ascuns de grup Etichete HTML. În mod implicit, mesajul de stare Curl arată dimensiunea documentului, procentul de finalizare și viteza de redirecționare. Ieșirea poate fi curățată puțin și filtrată după numele organizației care deține adresa IP. Starea curl poate fi dezactivată folosind opțiunea -s. Comanda ar trebui să fie executată prin grep pentru a obține doar OrgName:

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

În acest exemplu, rezultatul arată că OrgName este Microsoft Corp.

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



Vă prezentăm atenției curs nou din echipa The Codeby- „Testarea de penetrare a aplicațiilor web de la zero”. Teoria generală, Pregătirea mediului, Fuzzing pasiv și amprentare, Fuzzing activ, Vulnerabilități, Post-exploatare, Instrumente, Inginerie socială și multe altele.


Pentru ce este cURL?

  • cURL este excelent pentru simularea acțiunilor utilizatorului într-un browser.

Real exemplu practic: Trebuie să reporniți routerul (modem-ul) pentru a schimba adresa IP. Pentru a face acest lucru, trebuie să: să vă conectați la router, să accesați pagina de întreținere și să faceți clic pe butonul „Repornire”. Dacă această acțiune trebuie efectuată de mai multe ori, atunci procedura trebuie repetată. De acord, nu doriți să faceți această rutină manual de fiecare dată. cURL vă permite să automatizați toate acestea. Cu doar câteva comenzi cURL puteți obține autorizarea și finaliza sarcina pe router.

  • cURL este util pentru preluarea datelor de pe site-uri web pe linia de comandă.

Un alt exemplu practic: vrem să implementăm un afișaj statistici generale pentru mai multe site-uri. Dacă utilizați cURL, atunci acest lucru devine destul de bun sarcină banală: folosind cURL ne autentificăm pe serviciul de colectare a statisticilor (dacă este necesar), apoi (din nou folosind comenzi cURL) obținem paginile necesare, analizăm datele de care avem nevoie; procedura se repetă pentru toate site-urile noastre, apoi adăugăm și afișăm rezultatul final.

Aceste. cazurile de utilizare a cURL sunt destul de reale, deși, în majoritatea lor, cURL este nevoie de programatorii care îl folosesc pentru programele lor.

cURL acceptă multe protocoale și metode de autorizare, poate transfera fișiere, funcționează corect cu cookie-uri, acceptă certificate SSL, proxy și multe altele.

cURL în PHP și linie de comandă

Putem folosi cURL în două moduri principale: în scripturi PHP și pe linia de comandă.

Pentru a activa cURL în PHP pe server, trebuie să decomentați linia din fișierul php.ini

Extensie=php_curl.dll

Și apoi reporniți serverul.

Pe Linux trebuie să instalați pachetul curl.

Pe Debian, Ubuntu sau Linux Mint:

$ sudo apt-get install curl

Pe Fedora, CentOS sau RHEL:

$ sudo yum install curl

Pentru a vedea clar diferența de utilizare în PHP și pe linia de comandă, vom efectua aceleași sarcini de două ori: mai întâi în Script PHPși apoi pe linia de comandă. Să încercăm să nu ne confuzăm.

Preluarea datelor folosind cURL

Preluarea datelor folosind cURL în PHP

Exemplu in PHP:

Este foarte simplu:

$target_url— adresa site-ului care ne interesează. După adresa site-ului, puteți pune două puncte și adăugați adresa portului (dacă portul este diferit de cel standard).

curl_init— inițializează o nouă sesiune și returnează un descriptor, care în exemplul nostru este atribuit unei variabile $ch.

Apoi executăm cerere cURL funcţie curl_exec, căruia i se trece un descriptor ca parametru.

Totul este foarte logic, dar atunci când acest script este executat, conținutul site-ului va fi afișat pe pagina noastră. Dar ce se întâmplă dacă nu vrem să afișăm conținutul, ci vrem să-l scriem într-o variabilă (pentru procesarea sau analizarea ulterioară).

Să adăugăm puțin la scriptul nostru:

0) ( echo "Eroare curl: " . eroare_curl($ch); ) curl_close($ch); ?>

Avem o linie curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);.

curl_setopt— setează opțiuni. Lista completă opțiunile pot fi găsite pe această pagină: http://php.net/manual/ru/function.curl-setopt.php

$response_data = curl_exec($ch);

Acum valoarea scriptului este atribuită variabilei $response_data, cu care pot fi efectuate operațiuni suplimentare. De exemplu, puteți afișa conținutul acestuia.

Dacă (curl_errno($ch) > 0) ( echo „Eroare curl: „ . curl_error($ch); )

servesc pentru depanare în cazul în care apar erori.

Preluarea datelor folosind cURL pe linia de comandă

Pe linia de comandă, trebuie doar să tastați

Curl mi-al.ru

unde în loc de mi-al.ru- adresa site-ului dvs. web.

Dacă trebuie să copiați datele într-o variabilă în loc să afișați rezultatul pe ecran, atunci procedați astfel:

Temp=`curl mi-al.ru`

Cu toate acestea, unele date sunt încă afișate:

Pentru a preveni afișarea lor, adăugați cheia -s:

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

Puteți vedea ce a fost înregistrat:

Echo $temp | Mai puțin

Autentificare de bază și HTTP

Autentificarea, pur și simplu, înseamnă introducerea unui nume de utilizator și a unei parole.

Autentificarea de bază este autentificarea bazată pe server. Pentru aceasta, sunt create două fișiere: .htaccessŞi .htpasswd

Conținutul fișierului .htaccess este cam așa

AuthName „Numai pentru utilizatorii înregistrați!” AuthType Basic necesită un utilizator valid AuthUserFile /home/freeforum.biz/htdocs/.htpassw

Conținutul fișierului .htpasswd este cam așa:

Mial:CRdiI.ZrZQRRc

Aceste. login și parola hash.

Când încercați să accesați un folder protejat cu parolă, browserul va afișa ceva de genul:

Autentificarea HTTP este cazul când introducem o autentificare și o parolă într-un formular de pe site. Această autentificare este folosită atunci când vă conectați la e-mail, forumuri etc.

Autentificare cURL de bază (PHP)

Există un site http://62.113.208.29/Update_FED_DAYS/ care ne cere să ne logăm:

Să încercăm scriptul nostru inițial:

0) ( echo "Eroare curl: " . eroare_curl($ch); ) else ( echo $date_răspuns; ) curl_close($ch); ?>

Deși scriptul consideră că nu există nicio eroare, nu ne place deloc rezultatul:

Adăugați două rânduri:

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

În prima linie setăm tipul de autentificare - de bază. A doua linie conține numele și parola separate prin două puncte (în cazul nostru, numele și parola sunt aceleași - ru-board). A ieșit așa:

0) ( echo "Eroare curl: " . eroare_curl($ch); ) else ( echo $date_răspuns; ) curl_close($ch); ?>

Autentificare cURL de bază (pe linia de comandă)

Același lucru poate fi realizat pe linia de comandă cu o singură linie:

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

Nu am uitat să precizez tipul de autentificare, doar că în cURL tipul de autentificare de bază este implicit.

Totul a mers atât de repede pe linia de comandă încât, din frustrare, am scris următorul program. Ea se conectează la site și descarcă cea mai recentă actualizare:

Temp=`curl -s -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/ | grep -E -o „Actualizare_FED_201(1).(2).(2).7z” | unic | coada -n 1`; curl -o $temp -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/$temp

Cu doar câteva comenzi mai puteți adăuga:

  • despachetarea arhivei în directorul specificat;
  • lansarea actualizărilor ConsultantPlus (acestea sunt actualizări pentru acesta);
  • puteți implementa o verificare pentru a vedea dacă cea mai recentă a fost deja descărcată actualizare disponibilă sau a apărut ceva nou;
  • adăugați totul la Cron pentru actualizări zilnice.

CURL de autentificare HTTP

Autentificare HTTP cURL în PHP

Trebuie să știm:

  • adresa unde se trimit datele de autentificare
  • metoda de trimitere GET sau POST
  • log in
  • parolă

Uneori aceste date nu sunt suficiente. Să ne dăm seama.

Adresa la care trebuie să trimiteți datele poate fi preluată din formularul de autentificare. De exemplu:

Ne uităm la proprietate acţiune. Aceste. pagina finală este login.php. Avem nevoie de adresa completă, de exemplu acest http://188.35.8.64:8080/login.php

Aici găsim și metoda de trimitere: method="post"

Știu, de asemenea, login și parola: admin și qwerasdfzxcv

Pentru orice eventualitate, acesta nu este routerul meu (și nu știu al cui), așa că dacă vrei să mă enervezi, atunci nu trebuie să faci nimic murdar pe acest router.

Aceste. un șir este trimis la server din formular metoda POST. Teoretic, scriptul nostru anterior, la care am adăugat o nouă linie, ar trebui să funcționeze. Aceste. autentificarea trebuie să aibă loc.

0) ( echo "Eroare curl: " . eroare_curl($ch); ) else ( ) curl_close($ch); ?>

Linie nouă în scenariu

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

Aici curl_setopt— o funcție care ne este deja familiară pentru setarea opțiunilor pentru cURL, CURLOPT_POSTFIELDS- acesta este numele opțiunii pe care o setăm. CURLOPT_POSTFIELDS conține toate datele care sunt transferate folosind metoda POST. Ei bine, linia în sine LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv- acestea sunt exact datele pe care le transmitem.

Dacă examinați cu atenție formularul, veți vedea că acesta conține și câmpuri ascunse. Și datele pot fi prelucrate sau completate cu JavaScript Puteți studia toate acestea, dar eu prefer o metodă mai simplă.

Folosesc Wireshark. Acest program este conceput pentru a adulmeca (intercepta) traficul. Și în ea este foarte convenabil să vedeți ce anume este transmis pe site.

Urmăriți acest mic videoclip:

Aceste. cu adresa unde sunt transferate datele, am ghicit bine. Dar șirul transmis s-a dovedit a fi mult mai complicat.

Am introdus parametrul corect și, de asemenea, am modificat ușor scriptul, astfel încât nu numai să se conecteze, ci și să primească ceva de la router:

0) ( echo "Eroare curl: " . 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); , "", $results2); $results2 = str_replace("";", "", $results2); echo "Numele rețelei Wi-fi: $rezultate2
"; preg_match("|f_wpa.wpapsk1.value(.*)";|", $response_data2, $results3); $rezultate3 = str_replace("f_wpa.wpapsk1.value", "", $rezultate3);$rezultate3 = str_inlocuire("="", "", $rezultate3); $rezultate3 = str_inlocuire("";", "", $rezultate3);

echo „Parola rețelei Wi-Fi:

$rezultate3

"; ) curl_close($ch); ?>

Apropo, dacă proprietarul actualizează parola (dar nu actualizează firmware-ul), atunci noua parolă poate fi întotdeauna vizualizată la http://188.35.8.64:8080/model/__show_info.php?REQUIRE_FILE=/var/etc /httpasswd

(Aceasta este o vulnerabilitate binecunoscută în routerele D-Link DIR-300, D-Link DIR-320 și D-Link DAP-1353).

Autentificare HTTP cURL pe linia de comandă

Cunoaștem deja adresa completă, precum și șirul care urmează să fie transmis. Deci e simplu:

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

Cred că totul este clar, întrucât am luat deja în considerare aceste termene limită. Daca cineva nu intelege, intreaba in comentarii.

Ar fi mai corect să scriem acest titlu astfel: Cazuri de autorizare „Complexe”. Aceste. Pune cuvântul „complicat” între ghilimele. Par complicate doar la prima vedere, când nu este clar: unde are loc trimiterea, ce nume de câmpuri sunt, ce anume este trimis etc.

Dar, de fapt, toate se reduc la metodele POST sau GET. Pentru a înțelege exact ce se trimite, puteți salva pagina cu formularul pe disc și adăugați o funcție de afișare a datelor generate pentru trimitere la butonul de trimitere. Sau chiar mai simplu - ca mine, Wireshark.

Dacă datele sunt corecte, dar autentificarea nu are loc, atunci trebuie să săpați în următoarele direcții:

  • setați șirul de referință corect
  • setați șirul de agent de utilizator „corect”.

Toate acestea se pot face folosind metode de bază cURL, dar nu voi intra în asta. Lecția era deja suficient de lungă, dar am vrut să arăt și câteva trucuri cu cURL.

Sfaturi și trucuri cURL

cURL și primirea cookie-urilor pe lângă CURLOPT_COOKIEJAR

Cred că este deja clar că cURL gestionează corect cookie-urile - le stochează, le folosește atunci când serverul le solicită etc. Dar uneori cookie-urile trebuie salvate. Există o opțiune pentru aceasta numită CURLOPT_COOKIEJAR, dar nu este întotdeauna posibil să o utilizați. Acesta este ceea ce este dedicat primul nostru truc.

Uneori, din cauza modului în care PHP este configurat pe server, opțiuni precum CURLOPT_COOKIEJAR (vă permite să salvați cookie-urile primite într-un fișier) și CURLOPT_COOKIEFILE (vă permite să utilizați cookie-uri dintr-un fișier) nu ne sunt disponibile. Deoarece ei spun că folosind aceste opțiuni putem fura orice fișier de pe serverul lor. Iată soluția la această problemă:

1) Nu folosim CURLOPT_FOLLOWLOCATION

2) Folosiți curl_setopt($ch, CURLOPT_HEADER, 1)

3) Colectați cookie-uri din antet astfel:

Preg_match_all("|Set-Cookie: (.*);|U", $conținut, $rezultate); $cookies = implode(";", $rezultate);

4) Setați-le folosind curl_setopt($ch, CURLOPT_COOKIE, $cookies);

Al doilea sfat. Ne putem transforma din atacatori în victime. Pentru a evita să devenim victima unui atac de tip om-in-the-middle, facem asta.

Vă rugăm, toată lumea, opriți setarea CURLOPT_SSL_VERIFYPEER la fals sau 0. Dacă instalarea dvs. PHP nu are un set actualizat de certificate CA rădăcină, descărcați unul de pe site-ul web curl și salvați-l pe server:

Apoi setați calea în fișierul dvs. php.ini, de exemplu pe Windows:

Curl.cainfo=c:phpcacert.pem

Dezactivarea CURLOPT_SSL_VERIFYPEER permite un atac de tip om-in-the-middle (MITM), pe care nu-l dorim!

Ei bine, ultimul sfat pentru azi. Știați că sunt posibile un număr mare de solicitări de curl asincrone?

Pentru aceasta puteți folosi curl_multi_init. Detalii și exemplu de cod în documentația oficială http://php.net/manual/ru/function.curl-multi-init.php


Vă prezentăm atenției un nou curs din partea echipei The Codeby- „Testarea de penetrare a aplicațiilor web de la zero”. Teorie generală, pregătirea mediului de lucru, fuzzing pasiv și amprentare, fuzzing activ, vulnerabilități, post-exploatare, instrumente, inginerie socială și multe altele.


Pentru ce este cURL?

  • cURL este excelent pentru simularea acțiunilor utilizatorului într-un browser.

Exemplu practic real: trebuie să reporniți routerul (modem-ul) pentru a schimba adresa IP. Pentru a face acest lucru, trebuie să: să vă conectați la router, să accesați pagina de întreținere și să faceți clic pe butonul „Repornire”. Dacă această acțiune trebuie efectuată de mai multe ori, atunci procedura trebuie repetată. De acord, nu doriți să faceți această rutină manual de fiecare dată. cURL vă permite să automatizați toate acestea. Cu doar câteva comenzi cURL puteți obține autorizarea și finaliza sarcina pe router.

  • cURL este util pentru preluarea datelor de pe site-uri web pe linia de comandă.

Un alt exemplu practic: dorim să implementăm afișarea statisticilor generale pentru mai multe site-uri. Dacă folosim cURL, atunci aceasta devine o sarcină complet banală: folosind cURL ne autentificăm pe serviciul de colectare a statisticilor (dacă este necesar), apoi (din nou folosind comenzi cURL) obținem paginile necesare, analizăm datele de care avem nevoie; procedura se repetă pentru toate site-urile noastre, apoi adăugăm și afișăm rezultatul final.

Aceste. cazurile de utilizare a cURL sunt destul de reale, deși, în majoritatea lor, cURL este nevoie de programatorii care îl folosesc pentru programele lor.

cURL acceptă multe protocoale și metode de autorizare, poate transfera fișiere, funcționează corect cu cookie-uri, acceptă certificate SSL, proxy și multe altele.

cURL în PHP și linie de comandă

Putem folosi cURL în două moduri principale: în scripturi PHP și pe linia de comandă.

Pentru a activa cURL în PHP pe server, trebuie să decomentați linia din fișierul php.ini

Extensie=php_curl.dll

Și apoi reporniți serverul.

Pe Linux trebuie să instalați pachetul curl.

Pe Debian, Ubuntu sau Linux Mint:

$ sudo apt-get install curl

Pe Fedora, CentOS sau RHEL:

$ sudo yum install curl

Pentru a vedea clar diferența de utilizare în PHP și pe linia de comandă, vom efectua aceleași sarcini de două ori: mai întâi într-un script PHP și apoi pe linia de comandă. Să încercăm să nu ne confuzăm.

Preluarea datelor folosind cURL

Preluarea datelor folosind cURL în PHP

Exemplu in PHP:

Este foarte simplu:

$target_url— adresa site-ului care ne interesează. După adresa site-ului, puteți pune două puncte și adăugați adresa portului (dacă portul este diferit de cel standard).

curl_init— inițializează o nouă sesiune și returnează un descriptor, care în exemplul nostru este atribuit unei variabile $ch.

Apoi executăm cererea cu funcția cURL curl_exec, căruia i se trece un descriptor ca parametru.

Totul este foarte logic, dar atunci când acest script este executat, conținutul site-ului va fi afișat pe pagina noastră. Dar ce se întâmplă dacă nu vrem să afișăm conținutul, ci vrem să-l scriem într-o variabilă (pentru procesarea sau analizarea ulterioară).

Să adăugăm puțin la scriptul nostru:

0) ( echo "Eroare curl: " . eroare_curl($ch); ) curl_close($ch); ?>

Avem o linie curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);.

curl_setopt— setează opțiuni. O listă completă de opțiuni poate fi găsită pe această pagină: http://php.net/manual/ru/function.curl-setopt.php

$response_data = curl_exec($ch);

Acum valoarea scriptului este atribuită variabilei $response_data, cu care pot fi efectuate operațiuni suplimentare. De exemplu, puteți afișa conținutul acestuia.

Dacă (curl_errno($ch) > 0) ( echo „Eroare curl: „ . curl_error($ch); )

servesc pentru depanare în cazul în care apar erori.

Preluarea datelor folosind cURL pe linia de comandă

Pe linia de comandă, trebuie doar să tastați

Curl mi-al.ru

unde în loc de mi-al.ru- adresa site-ului dvs. web.

Dacă trebuie să copiați datele într-o variabilă în loc să afișați rezultatul pe ecran, atunci procedați astfel:

Temp=`curl mi-al.ru`

Cu toate acestea, unele date sunt încă afișate:

Pentru a preveni afișarea lor, adăugați cheia -s:

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

Puteți vedea ce a fost înregistrat:

Echo $temp | Mai puțin

Autentificare de bază și HTTP

Autentificarea, pur și simplu, înseamnă introducerea unui nume de utilizator și a unei parole.

Autentificarea de bază este autentificarea bazată pe server. Pentru aceasta, sunt create două fișiere: .htaccessŞi .htpasswd

Conținutul fișierului .htaccess este cam așa

AuthName „Numai pentru utilizatorii înregistrați!” AuthType Basic necesită un utilizator valid AuthUserFile /home/freeforum.biz/htdocs/.htpassw

Conținutul fișierului .htpasswd este cam așa:

Mial:CRdiI.ZrZQRRc

Aceste. login și parola hash.

Când încercați să accesați un folder protejat cu parolă, browserul va afișa ceva de genul:

Autentificarea HTTP este cazul când introducem o autentificare și o parolă într-un formular de pe site. Această autentificare este folosită atunci când vă conectați la e-mail, forumuri etc.

Autentificare cURL de bază (PHP)

Există un site http://62.113.208.29/Update_FED_DAYS/ care ne cere să ne logăm:

Să încercăm scriptul nostru inițial:

0) ( echo "Eroare curl: " . eroare_curl($ch); ) else ( echo $date_răspuns; ) curl_close($ch); ?>

Deși scriptul consideră că nu există nicio eroare, nu ne place deloc rezultatul:

Adăugați două rânduri:

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

În prima linie setăm tipul de autentificare - de bază. A doua linie conține numele și parola separate prin două puncte (în cazul nostru, numele și parola sunt aceleași - ru-board). A ieșit așa:

0) ( echo "Eroare curl: " . eroare_curl($ch); ) else ( echo $date_răspuns; ) curl_close($ch); ?>

Autentificare cURL de bază (pe linia de comandă)

Același lucru poate fi realizat pe linia de comandă cu o singură linie:

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

Nu am uitat să precizez tipul de autentificare, doar că în cURL tipul de autentificare de bază este implicit.

Totul a mers atât de repede pe linia de comandă încât, din frustrare, am scris următorul program. Ea se conectează la site și descarcă cea mai recentă actualizare:

Temp=`curl -s -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/ | grep -E -o „Actualizare_FED_201(1).(2).(2).7z” | unic | coada -n 1`; curl -o $temp -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/$temp

Cu doar câteva comenzi mai puteți adăuga:

  • despachetarea arhivei în directorul specificat;
  • lansarea actualizărilor ConsultantPlus (acestea sunt actualizări pentru acesta);
  • puteți verifica dacă cea mai recentă actualizare disponibilă a fost deja descărcată sau a apărut una nouă;
  • adăugați totul la Cron pentru actualizări zilnice.

CURL de autentificare HTTP

Autentificare HTTP cURL în PHP

Trebuie să știm:

  • adresa unde se trimit datele de autentificare
  • metoda de trimitere GET sau POST
  • log in
  • parolă

Uneori aceste date nu sunt suficiente. Să ne dăm seama.

Adresa la care trebuie să trimiteți datele poate fi preluată din formularul de autentificare. De exemplu:

Ne uităm la proprietate acţiune. Aceste. pagina finală este login.php. Avem nevoie de adresa completă, de exemplu acest http://188.35.8.64:8080/login.php

Aici găsim și metoda de trimitere: method="post"

Știu, de asemenea, login și parola: admin și qwerasdfzxcv

Pentru orice eventualitate, acesta nu este routerul meu (și nu știu al cui), așa că dacă vrei să mă enervezi, atunci nu trebuie să faci nimic murdar pe acest router.

Aceste. Un șir este trimis către server din formular folosind metoda POST. Teoretic, scriptul nostru anterior, la care am adăugat o nouă linie, ar trebui să funcționeze. Aceste. autentificarea trebuie să aibă loc.

0) ( echo "Eroare curl: " . eroare_curl($ch); ) else ( ) curl_close($ch); ?>

Linie nouă în scenariu

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

Aici curl_setopt— o funcție care ne este deja familiară pentru setarea opțiunilor pentru cURL, CURLOPT_POSTFIELDS- acesta este numele opțiunii pe care o setăm. CURLOPT_POSTFIELDS conține toate datele care sunt transferate folosind metoda POST. Ei bine, linia în sine LOGIN_USER=admin&LOGIN_PASSWD=qwerasdfzxcv- acestea sunt exact datele pe care le transmitem.

Dacă examinați cu atenție formularul, veți vedea că acesta conține și câmpuri ascunse. Și datele pot fi prelucrate sau completate cu JavaScript Puteți studia toate acestea, dar eu prefer o metodă mai simplă.

Folosesc Wireshark. Acest program este conceput pentru a adulmeca (intercepta) traficul. Și în ea este foarte convenabil să vedeți ce anume este transmis pe site.

Urmăriți acest mic videoclip:

Aceste. cu adresa unde sunt transferate datele, am ghicit bine. Dar șirul transmis s-a dovedit a fi mult mai complicat.

Am introdus parametrul corect și, de asemenea, am modificat ușor scriptul, astfel încât nu numai să se conecteze, ci și să primească ceva de la router:

0) ( echo "Eroare curl: " . 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); , "", $results2); $results2 = str_replace("";", "", $results2); echo "Numele rețelei Wi-fi: $rezultate2
"; preg_match("|f_wpa.wpapsk1.value(.*)";|", $response_data2, $results3); $rezultate3 = str_replace("f_wpa.wpapsk1.value", "", $rezultate3);$rezultate3 = str_inlocuire("="", "", $rezultate3); $rezultate3 = str_inlocuire("";", "", $rezultate3);

echo „Parola rețelei Wi-Fi:

$rezultate3

"; ) curl_close($ch); ?>

Apropo, dacă proprietarul actualizează parola (dar nu actualizează firmware-ul), atunci noua parolă poate fi întotdeauna vizualizată la http://188.35.8.64:8080/model/__show_info.php?REQUIRE_FILE=/var/etc /httpasswd

(Aceasta este o vulnerabilitate binecunoscută în routerele D-Link DIR-300, D-Link DIR-320 și D-Link DAP-1353).

Autentificare HTTP cURL pe linia de comandă

Cunoaștem deja adresa completă, precum și șirul care urmează să fie transmis. Deci e simplu:

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

Cred că totul este clar, întrucât am luat deja în considerare aceste termene limită. Daca cineva nu intelege, intreaba in comentarii.

Ar fi mai corect să scriem acest titlu astfel: Cazuri de autorizare „Complexe”. Aceste. Pune cuvântul „complicat” între ghilimele. Par complicate doar la prima vedere, când nu este clar: unde are loc trimiterea, ce nume de câmpuri sunt, ce anume este trimis etc.

Dar, de fapt, toate se reduc la metodele POST sau GET. Pentru a înțelege exact ce se trimite, puteți salva pagina cu formularul pe disc și adăugați o funcție de afișare a datelor generate pentru trimitere la butonul de trimitere. Sau chiar mai simplu - ca mine, Wireshark.

Dacă datele sunt corecte, dar autentificarea nu are loc, atunci trebuie să săpați în următoarele direcții:

  • setați șirul de referință corect
  • setați șirul de agent de utilizator „corect”.

Toate acestea se pot face folosind metode de bază cURL, dar nu voi intra în asta. Lecția era deja suficient de lungă, dar am vrut să arăt și câteva trucuri cu cURL.

Sfaturi și trucuri cURL

cURL și primirea cookie-urilor pe lângă CURLOPT_COOKIEJAR

Cred că este deja clar că cURL gestionează corect cookie-urile - le stochează, le folosește atunci când serverul le solicită etc. Dar uneori cookie-urile trebuie salvate. Există o opțiune pentru aceasta numită CURLOPT_COOKIEJAR, dar nu este întotdeauna posibil să o utilizați. Acesta este ceea ce este dedicat primul nostru truc.

Uneori, din cauza modului în care PHP este configurat pe server, opțiuni precum CURLOPT_COOKIEJAR (vă permite să salvați cookie-urile primite într-un fișier) și CURLOPT_COOKIEFILE (vă permite să utilizați cookie-uri dintr-un fișier) nu ne sunt disponibile. Deoarece ei spun că folosind aceste opțiuni putem fura orice fișier de pe serverul lor. Iată soluția la această problemă:

1) Nu folosim CURLOPT_FOLLOWLOCATION

2) Folosiți curl_setopt($ch, CURLOPT_HEADER, 1)

3) Colectați cookie-uri din antet astfel:

Preg_match_all("|Set-Cookie: (.*);|U", $conținut, $rezultate); $cookies = implode(";", $rezultate);

4) Setați-le folosind curl_setopt($ch, CURLOPT_COOKIE, $cookies);

Al doilea sfat. Ne putem transforma din atacatori în victime. Pentru a evita să devenim victima unui atac de tip om-in-the-middle, facem asta.

Vă rugăm, toată lumea, opriți setarea CURLOPT_SSL_VERIFYPEER la fals sau 0. Dacă instalarea dvs. PHP nu are un set actualizat de certificate CA rădăcină, descărcați unul de pe site-ul web curl și salvați-l pe server:

Apoi setați calea în fișierul dvs. php.ini, de exemplu pe Windows:

Curl.cainfo=c:phpcacert.pem

Dezactivarea CURLOPT_SSL_VERIFYPEER permite un atac de tip om-in-the-middle (MITM), pe care nu-l dorim!

Ei bine, ultimul sfat pentru azi. Știați că sunt posibile un număr mare de solicitări de curl asincrone?

Pentru aceasta puteți folosi curl_multi_init. Detalii și exemplu de cod în documentația oficială http://php.net/manual/ru/function.curl-multi-init.php


Viața unui dezvoltator web este tulburată de dificultăți. Este deosebit de neplăcut atunci când sursa acestor dificultăți este necunoscută. Este aceasta o problemă cu trimiterea cererii, sau cu răspunsul, sau cu o bibliotecă terță parte sau API-ul extern are erori? Există o mulțime de gadgeturi diferite care ne pot face viața mai ușoară. Iată câteva instrumente de linie de comandă pe care personal le găsesc de neprețuit.

răsuci
cURL este un program pentru transferul de date prin diferite protocoale, similar cu wget. Principala diferență este că, în mod implicit, wget salvează într-un fișier, în timp ce cURL iese în linia de comandă. Acest lucru face foarte ușor să vizualizați conținutul site-ului. De exemplu, iată cum să obțineți rapid IP-ul extern curent:

$ curl ifconfig.me 93.96.141.93
Opțiuni -i(arata titluri) si -Eu(afișați numai antetele) fac din cURL un instrument excelent pentru depanarea răspunsurilor HTTP și pentru a analiza exact ce vă trimite serverul:

$ curl -I site HTTP/1.1 200 OK Server: nginx Data: joi, 18 august 2011 14:15:36 GMT Tip de conținut: text/html; charset=utf-8 Conexiune: keep-alive Keep-alive: timeout=25
Parametru -L De asemenea, util, forțează cURL să urmărească automat redirecționările. cURL acceptă autentificare HTTP, cookie-uri, tunelare prin proxy HTTP, setări manuale în anteturi și multe, multe altele.

Asediu
- un instrument pentru testarea sarcinii. În plus, are o opțiune convenabilă -g, care este foarte asemănător cu curl –iL, dar în plus vă arată și antetele cererii http. Iată un exemplu de pe google.com (unele titluri au fost eliminate pentru concizie):

$ siege -g www.google.com GET / HTTP/1.1 Gazdă: www.google.com User-Agent: JoeDog/1.00 (X11; I; Siege 2.70) Conexiune: închide HTTP/1.1 302 Locație găsită: http:// www.google.co.uk/ Tip de conținut: text/html; charset=UTF-8 Server: gws Lungimea conținutului: 221 Conexiune: închide GET / HTTP/1.1 Gazdă: www.google.co.uk Agent utilizator: JoeDog/1.00 (X11; I; Siege 2.70) Conexiune: închide HTTP/ 1.1 200 OK Tip de conținut: text/html; set de caractere=ISO-8859-1 X-XSS-Protecție: 1; mode=block Conexiune: close
Dar ceea ce este cu adevărat excelent pentru Siege este testarea încărcării. Ca și benchmark-ul Apache ab, poate trimite multe solicitări paralele către site și poate vedea cum gestionează traficul. Următorul exemplu arată cum testăm Google cu 20 de interogări timp de 30 de secunde și apoi tipărim rezultatul:

$ siege -c20 www.google.co.uk -b -t30s ... Ridicarea asediului serverului... gata. Tranzacții: 1400 de accesări Disponibilitate: 100,00 % Timp scurs: 29,22 secunde Date transferate: 13,32 MB Timp de răspuns: 0,41 secunde Rata tranzacției: 47,91 trans/sec Debit: 0,46 MB/sec Concurență: 19,53 Tranzacții reușite: 40 tranzacții cu succes: 4,08 Cea mai scurtă tranzacție: 0,08
Una dintre cele mai utile caracteristici ale Siege este că poate funcționa nu numai cu o singură adresă, ci și cu o listă de adrese URL dintr-un fișier. Acest lucru este grozav pentru testarea încărcării, deoarece puteți simula traficul real pe site, mai degrabă decât să atingeți aceeași adresă URL din nou și din nou. De exemplu, iată cum să utilizați Siege pentru a încărca un server folosind adrese din jurnalul dvs. Apache:

$ cut -d " " -f7 /var/log/apache2/access.log > urls.txt $ siege -c -b -f urls.txt
Ngrep
Pentru o analiză serioasă a traficului, există Wireshark cu mii de setări, filtre și configurații. Există și o versiune de linie de comandă rechinul. Dar pentru sarcini simple, consider funcționalitatea Wireshark redundantă. Deci, dacă nu am nevoie de o armă puternică, folosesc . Vă permite să faceți același lucru cu pachetele de rețea ca grep face cu fișierele.

Pentru traficul web, aproape întotdeauna veți dori să utilizați parametrul -W pentru a păstra formatarea șirurilor, precum și opțiunea -q, care ascunde informații redundante despre pachetele nepotrivite. Iată un exemplu de comandă care interceptează toate pachetele cu o comandă GET sau POST:

Ngrep -q -W byline "^(GET|POST).*"
Puteți adăuga un filtru suplimentar pentru pachete, de exemplu, după o anumită gazdă, adresă IP sau port. Iată un filtru pentru tot traficul către și dinspre google.com, portul 80, care conține cuvântul „căutare”.

Ngrep -q -W gazdă „căutare” de la linia de bază www.google.com și portul 80

  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă s-ar grăbi undeva