.. sectionauthor:: |vedranmiletic|, |edvinmocibob| Rad s protokolima aplikacijske razine ===================================== Pregled protokola aplikacijske razine ------------------------------------- Pojam URL-a ^^^^^^^^^^^ **URL (uniform resource locator)** je znakovni niz koji predstavlja vezu na neki resurs. URL se često koristi za web stranice (HTTP protokol) no, između ostalih, podržava FTP i e-mail (mailto) protokole. Sintaksu URL-a čine: protokol, domena ili IP adresa, broj porta (opcionalno) i putanja do resursa. Primjerice: :: http://www.example.org/page/subpage Protokoli HTTP i HTTPS ^^^^^^^^^^^^^^^^^^^^^^ **HTTP (Hypertext Transfer Protocol)** je aplikacijski protokol i temelj podatkovne komunikacije za WWW. Internet Engineering Task Force (IETF) i the World Wide Web Consortium (W3C) stoje iza njegovog razvijanja. HTTP radi na request-response paradigmi po kljent-poslužitelj modelu. Jedna HTTP sesija sastoji se od niza zahtjeva (klijent) i odgovora (poslužitelj). **HTTPS** je proširenje HTTP protokola SSL/TLS slojem. HTTPS se koristi za sigurnu komunikaciju preko računalne mreže. U srži TLS-a je korištenje privatnih i javnih ključeva te enkripcija podataka. HTTPS još podrazumijeva autentifikaciju i korištenje certifikata za dokazivanje identiteta. Protokol FTP ^^^^^^^^^^^^ **FTP (File Transfer Protocol)** je mrežni protokol koji omogućuje transfer datoteka sa jednog domaćina na drugi preko TCP veze. Radi na klijent-poslužitelj principu. FTP može, ali ne mora koristiti autentifikaciju. **FTPS** proširuje FTP tako da uz autentifikaciju omogućuje i enkripciju (SSL/TLS usluge). FTPS treba razlikovati od SFTP protokola koji je vezan uz SSH (Secure Shell). Osnovne značajke i način korištenja alata cURL ---------------------------------------------- **cURL** (naredba ``curl``) je komandno linijski alat za prijenos podataka korištenjem URL sintakse. Podržava brojne protokole (DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet i TFTP), od kojih ćemo u nastavku koristiti manji dio. cURL je slobodan softver dostupan pod `MIT licencom `__. cURL podržava SSL certifikate, HTTP naredbe POST i PUT, FTP upload, HTTP upload zasnovan na obrascima, proxy poslužitelje, keksiće, autentifikaciju korištenjem korisničkog imena i zaproke (Basic, Digest, NTLM, Negotiate, kerberos i druge), nastavljanje prijenosa datoteke, tuneliranje putem proxy poslužitelja i još mnogo toga. Mi ćemo se ograničiti na osnovnu funkcionalnost, ali `službena dokumentacija `__ dostupna na `cURL-ovim stranicama `__ ima više detalja. Preuzimanje stranice ili datoteke ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Preuzimanje se vrši navođenjem URL-a. :: $ curl http://inf2.uniri.hr/ Naslovna stranica poslužitelja inf2

Poslužitelj inf2 je zvijer

... Ukoliko želimo spremiti izlaz u datoteku umjesto ispisati na standardni izlaz, koristimo parametar ``-o`` i navodimo ime datoteke: :: $ curl -o inf2-index.html http://inf2.uniri.hr/ % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 2033 100 2033 0 0 74324 0 --:--:-- --:--:-- --:--:-- 75296 Parametrom ``-O`` izlaz možemo spremiti u lokalnu datoteku istog imena kao datoteka na poslužitelju: :: $ curl -O http://inf2.uniri.hr/index.html % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 2033 100 2033 0 0 120k 0 --:--:-- --:--:-- --:--:-- 124k $ ls index.html Preuzimanje dijela datoteke ^^^^^^^^^^^^^^^^^^^^^^^^^^^ Parametrom ``-r`` moguće je specificirati raspon podataka datoteke koji će bit preuzet: :: curl -r 0-120 http://inf2.uniri.hr/index.html Naslovna stranica poslužitelja inf2</tit% Mjerenje napretka ^^^^^^^^^^^^^^^^^ Kod većih datoteka može se uočiti da je mjerenje napretka interaktivno: :: $ curl -O http://inf2.uniri.hr/VM/OS2-RM2-RM-RiTeh-Debian-VM.ova % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 2222M 0 2985k 0 0 9896k 0 0:03:49 --:--:-- 0:03:49 9886k Sa lijeva na desno stupci redom imaju sljedeće značenje. ===================== ========================================== Stupac Značenje ===================== ========================================== % postotak obavljenog ukupnog prijenosa Total ukupna veličina očekivanog prijenosa % postotak obavljenog prijenosa (download) Received trenutno preuzetih bajtova % postatak obavljenog prijenosa (upload) Xferd trenutno prenesenih bajtova Average Speed: Dload srednja bzina prijenosa (download) Average Speed: Upload srednja bzina prijenosa (upload) Time Total očekivano vrijeme za ukupni prijenos Time Current proteklo vrijeme Time Left preostalo vrijeme Current Speed srednja brzina prijenosa zadnjih 5 sekundi ===================== ========================================== Jednostavniji prikaz napretka parametrom ``-#`` prikazuje samo postotak obavljenog prijenosa numerički i znakom ``#``: :: $ curl -O -# http://inf2.uniri.hr/VM/OS2-RM2-RM-RiTeh-Debian-VM.ova # 1.6% Ograničenje brzine ^^^^^^^^^^^^^^^^^^ Ograničavanje se vrši parametrom ``-Y``. Pritom se brzina prijenosa navodi u bajtovima po sekundi. :: curl -Y 3000 http://inf2.uniri.hr/ U ovom primjeru smo brzinu prijenosa ograničili na približno 3 kilobajta po sekundi. Rječit način rada ^^^^^^^^^^^^^^^^^ Parametrom ``-v`` moguće je dobiti više detalja kod prijenosa. Sami detalji variraju ovisno o protokolu: :: $ curl -v http://inf2.uniri.hr/ * Hostname was NOT found in DNS cache * Trying 193.198.209.42... * Connected to inf2.uniri.hr (193.198.209.42) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.35.0 > Host: inf2.uniri.hr > Accept: */* > < HTTP/1.1 200 OK < Date: Thu, 20 Mar 2014 13:12:35 GMT * Server Apache/2.4.7 (Debian) is not blacklisted < Server: Apache/2.4.7 (Debian) < Last-Modified: Mon, 03 Mar 2014 17:20:34 GMT < ETag: "7f1-4f3b7016528d0" < Accept-Ranges: bytes < Content-Length: 2033 < Vary: Accept-Encoding < Content-Type: text/html < <!DOCTYPE html> <html lang="hr"> ... </html> * Connection #0 to host inf2.uniri.hr left intact Rad sa specifičnim značajkam HTTP protokola u alatu cURL -------------------------------------------------------- HTTP naredba GET ^^^^^^^^^^^^^^^^ Korištenjem parametra ``-X`` moguće je specificirati tip zahtjeva koji će biti napravljen na poslužitelj. HTTP sa zadanim postavkama koristi GET, tako da su iduće dvije naredbe ekvivalentne: :: $ curl http://inf2.uniri.hr/ $ curl -X GET http://inf2.uniri.hr/ HTTP naredba HEAD ^^^^^^^^^^^^^^^^^ HTTP naredba HEAD dohvaća metapodatke iz HTTP zaglavlja. Parametrom ``-i`` uključujemo prikaz dohvaćenog HTTP zaglavlja. :: $ curl -X HEAD -i http://inf2.uniri.hr/ HTTP/1.1 200 OK Date: Thu, 20 Mar 2014 13:18:14 GMT Server: Apache/2.4.7 (Debian) Last-Modified: Mon, 03 Mar 2014 17:20:34 GMT ETag: "7f1-4f3b7016528d0" Accept-Ranges: bytes Content-Length: 2033 Vary: Accept-Encoding Content-Type: text/html curl: (18) transfer closed with 2033 bytes remaining to read Greška koju cURL javlja je očekivana i posljedica je činjenice da HEAD dohvaća samo zaglavlje HTTP odgovora, ne i tijelo. Ona se može izbjeći korištenjem parametra ``-I`` za dohvaćanje zaglavlja umjesto ``-X HEAD``: :: vedranm@clover:~$ curl -I http://inf2.uniri.hr/ HTTP/1.1 200 OK Date: Thu, 20 Mar 2014 13:19:30 GMT Server: Apache/2.4.7 (Debian) Last-Modified: Mon, 03 Mar 2014 17:20:34 GMT ETag: "7f1-4f3b7016528d0" Accept-Ranges: bytes Content-Length: 2033 Vary: Accept-Encoding Content-Type: text/html HTTP naredba POST ^^^^^^^^^^^^^^^^^ Kod POST naredbe potrebno je parametrom ``-d`` navesti podatke koji se šalju u obliku ``varijabla=vrijednost``. Ukoliko se navodi više varijabli, parametar ``-d`` navodi se više puta: :: $ curl -X POST -d "ime=Ivan" -d "prezime=Horvat" -d "dob=23" http://inf2.uniri.hr/postexperiment.php <!DOCTYPE html> <html lang="hr"> <head> <meta charset="utf-8"> <title>Naslovna stranica poslužitelja inf2

Stranica za eksperimentiranje s HTTP POST zahtjevima

POST varijabla ime ima vrijednost Ivan

POST varijabla prezime ima vrijednost Horvat

POST varijabla dob ima vrijednost 23

Parametar ``-d`` implicira metodu POST, tako da je gornja naredba ekvivalentna naredbi: :: $ curl -d "ime=Ivan" -d "prezime=Horvat" -d "dob=23" http://inf2.uniri.hr/postexperiment.php HTTP naredba PUT ^^^^^^^^^^^^^^^^ Za postavljanje datoteka na poslužitelj koristi se HTTP metoda PUT. Međutim, iz sigurnosnih razloga ona je većinom nedozvoljena na poslužiteljima: :: $ curl -T lokalnadatoteka.txt http://inf2.uniri.hr/podaci.txt 405 Method Not Allowed

Method Not Allowed

The requested method PUT is not allowed for the URL /podaci.txt.


Apache/2.4.7 (Debian) Server at inf2.uniri.hr Port 80
HTTP referer ^^^^^^^^^^^^ HTTP referer naveden u zahtjevu moguće je navesti parametrom ``-e``. Da bi vidjeli promjenu, potrebno je uključiti rječiti način rada. :: $ curl -v -e www.google.hr -I http://inf2.uniri.hr/ * Hostname was NOT found in DNS cache * Trying 193.198.209.42... * Connected to inf2.uniri.hr (193.198.209.42) port 80 (#0) > HEAD / HTTP/1.1 > User-Agent: curl/7.35.0 > Host: inf2.uniri.hr > Accept: */* > Referer: www.google.hr > < HTTP/1.1 200 OK HTTP/1.1 200 OK < Date: Thu, 20 Mar 2014 13:45:30 GMT Date: Thu, 20 Mar 2014 13:45:30 GMT * Server Apache/2.4.7 (Debian) is not blacklisted < Server: Apache/2.4.7 (Debian) Server: Apache/2.4.7 (Debian) < Last-Modified: Mon, 03 Mar 2014 17:20:34 GMT Last-Modified: Mon, 03 Mar 2014 17:20:34 GMT < ETag: "7f1-4f3b7016528d0" ETag: "7f1-4f3b7016528d0" < Accept-Ranges: bytes Accept-Ranges: bytes < Content-Length: 2033 Content-Length: 2033 < Vary: Accept-Encoding Vary: Accept-Encoding < Content-Type: text/html Content-Type: text/html < * Connection #0 to host inf2.uniri.hr left intact HTTP user agent ^^^^^^^^^^^^^^^ HTTP user agent koji cURL koristi u zadanim postavkama je ``curl/7.35.0`` (pri čemu je 7.35.0 verzija cURL-a) i moguće ga je promijeniti parametrom ``-A``. Ponovno koristimo rječit način rada kako bi u zaglavlju vidjeli razliku: :: $ curl -v -A 'Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20140205 Firefox/24.0 Iceweasel/24.3.0' -I http://inf2.uniri.hr/ * Hostname was NOT found in DNS cache * Trying 193.198.209.42... * Connected to inf2.uniri.hr (193.198.209.42) port 80 (#0) > HEAD / HTTP/1.1 > User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20140205 Firefox/24.0 Iceweasel/24.3.0 > Host: inf2.uniri.hr > Accept: */* > < HTTP/1.1 200 OK HTTP/1.1 200 OK < Date: Thu, 20 Mar 2014 13:47:25 GMT Date: Thu, 20 Mar 2014 13:47:25 GMT * Server Apache/2.4.7 (Debian) is not blacklisted < Server: Apache/2.4.7 (Debian) Server: Apache/2.4.7 (Debian) < Last-Modified: Mon, 03 Mar 2014 17:20:34 GMT Last-Modified: Mon, 03 Mar 2014 17:20:34 GMT < ETag: "7f1-4f3b7016528d0" ETag: "7f1-4f3b7016528d0" < Accept-Ranges: bytes Accept-Ranges: bytes < Content-Length: 2033 Content-Length: 2033 < Vary: Accept-Encoding Vary: Accept-Encoding < Content-Type: text/html Content-Type: text/html < * Connection #0 to host inf2.uniri.hr left intact Primjeri user agenata koji se također mogu koristiti: * 'Mozilla/3.0 (Win95; I)' * 'Mozilla/3.04 (Win95; U)' * 'Mozilla/2.02 (OS/2; U)' * 'Mozilla/4.04 [en] (X11; U; AIX 4.2; Nav)' * 'Mozilla/4.05 [en] (X11; U; Linux 2.0.32 i586)' HTTP kolačići (cookies) ^^^^^^^^^^^^^^^^^^^^^^^ HTTP kolačiće koje stranica nudi moguće je spremiti u datoteku korištenjem parametra ``-c`` i navođenjem imena datoteke. :: $ curl -c cookies.txt http://www.google.hr/ ... $ cat cookies.txt # Netscape HTTP Cookie File # https://curl.haxx.se/docs/http-cookies.html # This file was generated by libcurl! Edit at your own risk. .google.hr TRUE / FALSE 1458395398 PREF ID=66d2d46d264532f6:FF=0:TM=1395323398:LM=1395323398:S=AZv39tEXo7wyBIxv #HttpOnly_.google.hr TRUE / FALSE 1411134598 NID 67=s6f-BTMOKNbJ8iGJe_51mp7JaQH2mDHhS-zRTcQiEq1CBUL1o7XgNo8087-szuFre2SZ1u6NNOTPVbNussrGdSLWysuhK-INU7sIuJ2SQUTFzsZkg31ilyB3uYwc6Qdf Kolačiće je moguće iskoristiti kod ponovnog pristupa stranici navođenjem imena datoteke parametrom ``-b`` :: $ curl -b cookies.txt http://www.google.hr/ ... ili navođenjem kolačića u obliku: :: $ curl -b "ID=66d2d46d264532f6; FF=0; TM=1395323398; LM=1395323398; S=AZv39tEXo7wyBIxv" http://www.google.hr/ ... Parametrom ``-v`` vidimo koji kolačići se šalju: :: $ curl -v -I -b "ID=66d2d46d264532f6; FF=0; TM=1395323398; LM=1395323398; S=AZv39tEXo7wyBIxv" http://www.google.hr/ * Hostname was NOT found in DNS cache * Trying 173.194.70.94... * Connected to www.google.hr (173.194.70.94) port 80 (#0) > HEAD / HTTP/1.1 > User-Agent: curl/7.35.0 > Host: www.google.hr > Accept: */* > Cookie: ID=66d2d46d264532f6; FF=0; TM=1395323398; LM=1395323398; S=AZv39tEXo7wyBIxv > < HTTP/1.1 200 OK HTTP/1.1 200 OK < Date: Thu, 20 Mar 2014 13:54:57 GMT Date: Thu, 20 Mar 2014 13:54:57 GMT < Expires: -1 Expires: -1 < Cache-Control: private, max-age=0 Cache-Control: private, max-age=0 < Content-Type: text/html; charset=ISO-8859-2 Content-Type: text/html; charset=ISO-8859-2 < Set-Cookie: PREF=ID=c15f2cf143ce0e16:FF=0:TM=1395323697:LM=1395323697:S=hADpF-Ww5RNTpWhG; expires=Sat, 19-Mar-2016 13:54:57 GMT; path=/; domain=.google.hr Set-Cookie: PREF=ID=c15f2cf143ce0e16:FF=0:TM=1395323697:LM=1395323697:S=hADpF-Ww5RNTpWhG; expires=Sat, 19-Mar-2016 13:54:57 GMT; path=/; domain=.google.hr < Set-Cookie: NID=67=M_DGSRCzXOL0vR5WYiCeuoitrNy23wKTuag6Zs-IkQRo6fTjm-ERQyR6obpfgtHpaUncQFED5rXaVE9LvVOGvlfLIHVGr4xywZhlw0mZZdByCofUPihRQLQ1rwXszRkQ; expires=Fri, 19-Sep-2014 13:54:57 GMT; path=/; domain=.google.hr; HttpOnly Set-Cookie: NID=67=M_DGSRCzXOL0vR5WYiCeuoitrNy23wKTuag6Zs-IkQRo6fTjm-ERQyR6obpfgtHpaUncQFED5rXaVE9LvVOGvlfLIHVGr4xywZhlw0mZZdByCofUPihRQLQ1rwXszRkQ; expires=Fri, 19-Sep-2014 13:54:57 GMT; path=/; domain=.google.hr; HttpOnly < P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info." P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info." * Server gws is not blacklisted < Server: gws Server: gws < X-XSS-Protection: 1; mode=block X-XSS-Protection: 1; mode=block < X-Frame-Options: SAMEORIGIN X-Frame-Options: SAMEORIGIN < Alternate-Protocol: 80:quic Alternate-Protocol: 80:quic < Transfer-Encoding: chunked Transfer-Encoding: chunked < * Connection #0 to host www.google.hr left intact Dodatak: Specifične značajke protokola FTP i ostalih protokola u alatu cURL --------------------------------------------------------------------------- Dohvaćanje datoteke sa poslužitelja korištenjem FTP-a ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Dohvaćanje FTP URL-a se izvodi slično kao kod HTTP-a: :: $ curl ftp://inf2.uniri.hr/ drwxr-xr-x 2 0 0 4096 Mar 30 23:21 pub U slučaju da u direktoriju postoje datoteke, one će biti ispisane: :: $ curl ftp://inf2.uniri.hr/pub/ -rw-r--r-- 1 0 0 18 Mar 30 23:21 cake.txt U slučaju da preuzimamo datoteku, na standardn izlaz ispisuje se njen sadržaj: :: $ curl ftp://inf2.uniri.hr/pub/cake.txt THE CAKE IS A LIE Podizanje datoteka na poslužitelj korištenjem FTP-a ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Postavljanje datoteke na FTP poslužitelj vrši se parametrom ``-T``: :: $ curl -T lokalnadatoteka.txt ftp://inf2.uniri.hr/datoteka.txt Postavljanje datoteke uz prijavu vrši se parametrom ``-u`` i navođenjem korisničkog imena i zaporke: :: $ curl -T lokalnadatoteka.txt -u vedranm:l33th4x0rp4ssw0rd ftp://inf2.uniri.hr/datoteka.txt Ukoliko je nakon ``-u`` navedeno samo korisničko ime, cURL će tražiti unos zaporke: :: $ curl -T lokalnadatoteka.txt -u vedranm ftp://inf2.uniri.hr/datoteka.txt Enter host password for user 'vedranm': Korištenje protokola SCP i SFTP ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ U cURL-u se SCP i SFTP koriste slično kao FTP; razlika je da postoji mogućnost korištenja privatnog ključa umjesto lozinke. Ponovno parametrom ``-u`` navodimo korisničko ime kojim se prijavljujemo na poslužitelj. Primjer korištenja SCP-a je oblika: :: $ curl -u vedranm scp://inf2.uniri.hr/home/vedranm/epic-battle.txt Enter host password for user 'vedranm': Tacgnol vs Longcat On a scale from 1 to epic, I'd probably say EPIC Primjer s korištenjem SFTP-a je oblika: :: $ curl -u vedranm sftp://inf2.uniri.hr/~/protip.txt Enter host password for user 'vedranm': Doom II protip: To defeat the Cyberdemon, shoot at it until it dies.