Telnet vasitəsilə brauzerin emulyasiya edilməsi

Qeyd etmək lazımdır ki, brauzer sorğu göndərən zaman özünü telnet vasitəsilə başlıqları əllə – mətn rejimidə daxil edən istifadəçi kimi aparır. Yəni, məsələn, brauzerdə http://example.com yığmaq əvəzinə əməliyyat sisteminin əmrlər sətrində (command-line) aşağıdakı əmrləri yazıb uyğun <Enter> düyməsini vurun:

telnet example.com 80<Enter>
GET /index.html HTTP/1.0<Enter>
Host: example.com<Enter>
<Enter>

Sonuncu <Enter> düyməsini vurandan sonra qarşınızda index.html HTML-səhifəsinin kodlarının görsəndiyini görəcəksiniz. Məsləhətdir ki, göstərilən proseduru həqiqətən də yerinə yetirəsiniz. Bu, sizi HTTP protokolu haqqında fikirlər səslənəndə elə də mürəkkəb olmayan anlayış haqqında danışıldığına əmin edəcək. Göründüyü kimi, hər şey əslində təsəvvür edilən qədər mürəkkəb deyil.

İndi serverin necə işlədiyinə baxaq. Hər şey növbəti ardıcıllıqla baş verir: server sorğunun başlıqlarını oxuyur və nn simvolunu gözləyir. Bu simvolu qəbul edən kimi server ona nə göndərildiyini aydınlaşdırmağa və uyğun əməliyyatları yerinə yetirməyə başlayır.

Başlıqların köməyi ilə kodlaşdırmanın, cookies, POST metodunun  yoxlanması və s. kimi mexanizmlər yerinə yetirilir. Əgər server hər hansı başlığı başa düşmürsə onu ya nəzərə almır ya da istifadəçiyə bu barədə məlumat göndərir (bu, administratorun serveri necə konfiqurasiya etməsindən asılıdır).

Gündəlik iş zamanı belə məsələdə demək olar ki, telnet-dən heç vaxt istifadə edilmir, çünki bu üsul telnet vasitəsilə detallı şəkildə çox məlumatın daxil edilməsini tələb edir. Sistem administratoru və Veb-proqramçıların çoxu bundan daha rahat curl funksional utilitindən istifadə edir:

curl: example.com 80

Sorğunun başlıqları – headers və GET metodu

Brauzerdə adres sətrində hər hansı bir somestring sətri yığıb <Enter> vururq. Bu zaman sual yarana bilər ki, bundan sonra gedişat necə davam edir? Brauzer somestring-i serverə göndərir? Cavab: Xeyr. Məsələ bir az qəlizdir. Brauzer ona təqdim edilən sətri analiz edir, onun daxilində serverin host adını və port nömrəsini çıxarır, server:port adresinə uyğun Veb-serverlə əlaqə yaradır və ona aşağıdakına bənzər məlumat ötürür:

GET somestring HTTP/1.0n 
••• digər məlumatlar •••
nn

Burda n işarəsi sətrin dəyişdirilməsi – yeni sətir işarəsi, nn isə mütləq şəkildə iki yeni sətir simvoludur və sorğunun sonunu bildirir (daha dəqiq desək, sorğunun başlığının bitməsini). Bu işarəni göndərənə qədər server bizim müraciəti emal etməyə başlamayacaq.

Göründüyü kimi GET sətrindən sonra yeni sətir işarəsi ilə bir birindən ayrılmış başqa informativ sətirlər də gələ bilər. Adətən, bu sətirləri brauzer özü formalaşdırır. Bu sətirlər sorğunun başlıqları və ya headers adlanır və onların sayı məhtud deyil. HTTP protokolu məhz bu başlıqların formalaşdırılması və interpretasiyası qaydalırını müəyyən edir.

Beləliklə HTTP protokolu ilə yaxından tanış olmağa başlayırıq. Göründüyü kimi, o, özlüyündə server və brauzerin öz aralarında mübadilə etdikləri başlıqların toplusundan və irəlidə göstəriləcək POST-a aid bir iki razılaşmadan başqa bir şey deyil.

Serverə göndərilən başlıqların hamısı server tərəfindən emal edilmir, bəziləri mühitin dəyişənləri formasında işə salınan skriptə ötürülür. Mühitin dəyişənləri dedikdə əməliyyat sistemi (daha dəqiq proqramı işə salan proses) tərəfindən parametrlərin işə salınan proqrama xüsusi – adlandırılmış formada ötürülməsi nəzərdə tutulur. Proqram mühitin istənilən müəyyən edilmiş dəyişəninin qiymətini onun adını göstərmklə xüsusi funksiyalar vasitəsilə əldə edə bilir. Hər bir CGI-skript də bu və ya digər başlıqların qiymətini əldə etmək üçün məsələyə məhz bu cür yanaşmalıdır. Təəssüf ki, mühitin skriptə ötürülən dəyişənləri müəyyən standartlarla məhtudlaşdırılıb və bəzi dəyişənləri skript vasitəsilə heç cürə əldə etmək mümkün deyil. Belə hallarda məsələyə xüsusi yanaşmalar mövcuddur.

Əslində, daha dəqiq olsaq, server administratoru serveri elə konfiqurasiya edə bilər ki, skriptə həm də standartla icazə verilməyən dəyişənlər də ötürülə bilsin.

GET

Format: GET skriptadı?parametrlər HTTP/1.0
Mühit dəyişəni: REQUEST_URI; QUERY_STRING dəyişənində parametrlər sətri, REQUEST_METHOD dəyişənində GET açar sözü saxlanılır.

Bu başlıq serverdə sorğu edilən sənədin adresini müəyyən edir və POST metodu tətbiq edilmirsə mütləq göstərilməlidir. Bu zaman həm də skriptə ötürülən parametrlər müəyyən edilir. Əgər skriptə heç nə ötürülmürsə və ya sorğu edilən adi statik səhifədirsə sual işarəsindən sonrakı hissə və həmçinin sual işarəsi özü də göstərilmir. HTTP/1.0 yazısı əvəzinə başqa yazı da ola bilər, məsələn, HTTP/1.1. Bu halda istifadəçidən serverə ötürülən verilənlərin və digər başlıqların emalı zamanı məhz buna uyğun razılaşma nəzrə alınacaq.

POST

Format: Content-Type: application/x-www-form-urlencoded
Mühit dəyişəni: CONTENT_TYPE

Bu başlıq ötürülən məlumatın tipini müəyyən edir. Adətən bu dəyişənin dəyəri application/x-www-form-urlencoded kimi olur və bu, hərf-rəqəm və digər görsənən simvollarından başqa simvolların xüsusi üsulla kodlaşdırılacağı formatı müəyyən edir. Məlumat mübadiləsinin məhz bu cür formatı GETPOST metodlarında istifadə edilir. Bundan başqa digər, məşhur format – multipart/form-data – da mövcuddur. Bu format faylların serverə yüklənməsi zamanı istifadə edilir.

Qeyd etmək lazımdır ki, bu başlıq server tərəfindən istifadə edilmir və birbaşa işə salınan skriptə mühit dəyişəni kimi ötürülür.

HOST

Format: Host: host_adı
Mühit dəyişəni: HTTP_HOST

HTTP 1.1 protokoluna uyğun olaraq İnternetdə hər bir serverdə eyni vaxtda bir neçə host yerləşə bilər. Buna görə də brauzerin serverə hansı hosta müraciət etməyə hazırlaşdığını bildirmək üçün bir üsul olmalıdır. Host başlığı da məhz bunun üçün nəzərdə tutulub. Bu başlıqda brauzer istifadəçinin daxil etdiyi host adını göstərir.

User-Agent

Format: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
Mühit dəyişəni: HTTP_USER_AGENT

Bu başlıq vasitəsilə istifadəçi serverə özü haqqında məlumat ötürür. Bu məlumat heç də həmişə düzgün və dəqiq olmur. Yuxarıda göstərilən misaldan brauzerin versiyası (Firefox), əməliyyat sistemi (64 bitli Windows 8.0) haqqında məlumat əldə etmək olar.

REFERER

Format: Referer: URL_adres
Mühit dəyişəni: HTTP_REFERER

Bir qayda olaraq bu başlıq brauzer tərəfindən formalaşdırılır və onun dəyəri istifadəçinin link vasitəsilə bu səhifəyə hansı səhifədən keçdiyi URL olur. Buna görə də, əgər təhlükəsizlik nöqteyi nəzərindən bu başlığın qiymətini izləyən skript yazırsınızsa nəzər almaq lazımdır ki, bu başlıq brandmauer tərəfindən kəsilə və ya məqsədyönlü olaraq dəyişdirilə bilər.

Diqqət yetirmək lazımdır ki referer sözü İngilis dilindəki referrer sözündəki kimi iki rr hərfləri ilə yazılmır. Görünür HTTP standartını müəyyən edən mütəxəssislər budan xəbərsiz olublar. Buna görə də HTTP_REFERER-dən istifadə edərkən bu səhfin görülən işdə çaşdırıcı ola biləcəyini nəzərə almaq lazımdır.

Content-length

Format: Content-length: rəqəm
Mühit dəyişəni: CONTENT_LENGTH

Bu başlıq POST metodu vasitəsilə ötürülən məlumatın onluq say sistemində uzunluğunu göstərir. GET metodundan istifadə edilərsə bu başlıq ümumiyyətlə olmur və uyğun olaraq mühit dəyişəni kimi də təyin edilmir.

Cookie

Format: Cookie: cookies_məlumatları
Mühit dəyişəni: HTTP_COOKIE

Burda URL-kodlaşdırmasında kodlaşdırılmış bütün cookies saxlanılır.

Accept

Format: Accept: text/html, text/plain, image/gif, image/jpeg
Mühit dəyişəni: HTTP_ACCEPT

Bu başlıqda brauzer hansı növ sənədləri “başa düşdüyünü” sadalayır. Son zamanlar brauzerlər bu başlığı ciddi hesab etmir və sadəcə istənilən tipi göstərən “*/*” qiymətini göndərirlər.

Yuxarıda göstərilənlərdən başqa sorğuların bir çox başlıqları da mövcuddur, ancaq onlardan proqramlaşdırma zamanı çox istifadə edilmədiyindən onlar haqqında burda məlumat verilməyib.

CGI interfeysi və HTTP protokolu

CGI (Common Gateway Interface) dedikdə Veb-serverlərin Veb-proqramların işləməsi zamanı riayət edilməli olduğu razılaşmalar toplusu nəzərdə tutulur. Hal-hazırda praktiki olaraq CGI ilə birlikdə onun daha sürətli və təhlükəsiz variantı olan FastCGI-dan istifadə edilir. Aşağıda deyiləcək mülahizələr bunların hər iki üçün doğrudur.

CGI nədir

Brauzerin adres yerində http://site.com/path/to/image.jpg kimi URL yazırıq və hər hansı HTML səhifənin və ya başqa formada məsələn, şəkil açılacağını gözləyirik. Başqa sözlə desək biz düşünürük ki, hostda /path/to/ kataloqunda image.jpg faylı yerləşdirilib və brauzerə ötürüləcək.

Əslində isə məsələ bir az fərqlidir. Burda iki hal ola bilər:

  • Server administratorunun serverdə istənilən obyektə alias yaratmaq imkanı olduğundan hostda /path/to/ yolu, eyni ilə də image.jpg faylı ümumiyyətlə mövcud olmaya bilər və ya heç bir alias yaratmadan Veb-serverdə proqram yazaraq hər belə müraciəti “tutaraq” lazımi reaksiyanı vermək olar.
  • image.jpg ümumiyyətlə qrafik fayl olmaya bilər. Bunun əvəzinə o,  bizim sorğumuz nəticəsində sürətlə işə düşüb lazımi komandaları yerinə yetirərək nəticəsini HTML və ya digər məsələn, şəkil formatında istifadəçiyə qaytaran proqram ola bilər. İstifadəçi ümumiyyətlə nəyin baş verdiyini başa düşməyəcək. Onun üçün şəkli yükləməklə hər hansı proqramı işə salmaq arasında heç bir fərq olmayacaq. Hətta demək olar ki, istifadəçi əslində nə baş verdiyini heç cürə bilə bilməz.

Sonuncu bənd daha möhtəşəm səslənir. Əgər bunun ideyasını başa düşə bildinizsə deməli, artıq ümumi olaraq CGI-ın nə olduğunu başa düşmüsünüz. Ənənəvi olaraq, CGI razılaşması ilə işləyən proqramlar skript (Ingilis dilində script) adlandırılır. Daha doğrusu bir çox halda bu proqramları Basic, Pyton və ya PHP kimi interpretator dillərində yazıldığı üçün belə adlandırırlar.

Deyilənləri ümumiləşdirsək görürük ki, xüsusi halda səhifələri “iş vaxtı” formalaşdıra bilən güclü mexanizm əldə etmiş olduq. Məsələn, deyək ki, bizə hər hansı bir sənəddə hal-hazırki tarixin yazılması lazımdır. Aydındır ki, istifadəçinin sənədi yükləyəcəyi tarix müxtəlif ola biləcəyindən bunu əvvəlcədən sənəddə yazmaq mümkün deyil. Ancaq, biz tarixi hesablayıb sənəddə yaza bilən və nəticəni istifadəçiyə ötürə bilən skript yaza bilərik. İstifadəçi öz növbəsində heç nə hiss etməyəcək.

Yuxarıda göstərilən modeldə çatışmayan bir məsələ var. Doğrudan da, fərz edək ki, bizə səhifəmizdə saat qurşağından asılı olaraq saat göstərilməsi lazımdır. Skript istifadəçinin hansı saat qurşağında olduğunu və ya istifadəçidən alınması lazım olan hər hansı məlumatı neçə əldə edəcək? Deməli, istifadəçiyə məlumatları əldə etməyə imkan verməklə yanaşı onları həmçinin serverə ötürə bilən mexanizm də olmalıdır (bizim halda Bakıya nəzərən zaman fərqini). Bu məsələni də CGI həll edə bilir.

Yadınızdadırsa əvvəlki mövzularda URL-in quruluşu haqqında danışmışdıq. Bütün bu danışılanlar onun xüsusi formasına aid idi. Əslində URL daha üzün formaya malikdir.
http://site.com/path/to/image.jpg?parameters

Göründüyü kimi, URL-in sonunda sual – ? – işarəsindən sonra əlavə parameters yazısı, sətri də mövcud ola bilər. Müəyyən dərəcədə bu, əməliyyat sistemində kommand layn – əmr sətrinə bənzəyir. Onun uzunluğu istənilən qədər ola bilər və daxilində istənilən məlumat yerləşdirilə bilər (bəzi simvolların URL formatında kodlaşdırılmasını nəzər almaq şərti ilə). Məhs bu sətir CGI-skriptə ötürülür.

Əslində parametrlər sətrinin uzunluğuna müəyyən məhtudiyyət var, ancaq bu məhtudiyyətlə praktikada çox az hallarla qarşılaşdığından onun haqqında nadir hallarda danışılır. Brauzer üçün URL çox uzun olarsa bunu çox sadə hiss etmək olur, həmin link-keçid qeyri-aktiv olur və ona “klik” etmək olmur.

Yuxarıdakı məsələyə qayıdaq. İndi istifadəçi öz saat qurşağını göstərə bilər. Bunu belə etmək olar:
http://site.com/script.cgi?time=+5&name=Tural

Belə təsfir zamanı parametrləri ampersand – “&” – işarəsi vasitəsilə ayırmaq qəbul edilmişdir. Brauzerlər formaların emalı zamanı məhz buna uyğun işlədiklərinə görə biz də irəlidə bu cür razılaşmaya uyğunlaşacağıq. Skript də öz növbəsində bu parametrlərə adekvat reaksiya verməlidir: sətri tərkibinə görə hissələrinə ayırmalı, dəyişənləri yaratmalı və s.

Skriptə göndərilən məlumatlar URL-in əmr sətrinə yerləşə bilirsə və bu üsulla göndərilirsə buna GET metod deyilir. Faktiki olaraq, hətta heç bir parametr ötürülmürsə belə (məsələn, səhifənin açılması zamanı) GET metodu tətbiq edilmiş olur. Bu metoddan başqa onun qədər çox istifadə edilən POST metodu da mövcuddur.

Virtual host

Virtual host şəbəkədə unikal IP ünvanına malik olmayan, ona xüsusi adres məsələn, DNS adı vasitəsilə qoşulması mümkün olan hostdur.

HTTP protokol geniş yayıldığına görə hal-hazırda virtual hostların sayı dayanmadan artmaqdadır. Veb-brauzer nöqteyi nəzərindən, daha doğrusu bu brauzerlərlə işləyən istifadəçilərin nöqteyi nəzərindən virtual host adi host kimidir, ancaq onlara birbaşa IP adres vasitəsilə müraciət etmək mümkün deyil.

Virtual host anlayışı təkcə Veb servis anlayışı ilə məhtudlaşmır. Bir çox digər servislərin daxilində də özünə uyğun Veb və HTTP protokolla əlaqəsi olmayan virtual host anlayışı var. SMTP (Send Mail Transfer Protocol – məktubların ötürülməsi protokolu) servisinin serveri olan sendmail daxilində də həmçinin virtual host anlayışından istifadə edilir. Bu halda “virtual host” anlayışı server işə salınmış əsas hostun sinonimidir. Məsələn, əgər syn.com microsoft.com-un sinonimidirsə [email protected] əslində elə [email protected] ilə eyni mənaya gəlir. Bu halda da qeyd etmək lazımdır ki, virtual host ayrıca IP adresə malik olmur.

Port nömrəsi

Host adından dərhal sonra iki nöqtədən – “:” sonra port nömrəsi göstərilə bilər. Port nömrəsi göstərilməyə də bilər. Əvvəldən belə alınıb ki, HTTP protokolunun standart portu 80-dir və istifadəçi aydın şəkildə port nömrəsini daxil etmədikdə brauzer məhz bu portdan istifadə edir. Port serverdə işləyən proqramı (demon) identifikasiya etmək üçün istifadə edilir. Xüsusi halda 80 portu Veb-serverlə əlaqələndirilir. O da öz növbəsində HTTP müraciətləri emal edib istifadəçilərə lazım olan məlumatları qaytarır. Digər protokollar, məsələn, IMAP və ya SSH üçün də demonlar mövcuddur, ancaq onlara brauzer vasitəsilə qoşulmaq mümkün deyil.

Protokol

Protokol URL-in əvvəlində gəlir, yazılışı iki əyri xətt – bölmə işarəsi ilə sonlanır (məsələn, http://) və brazuerə Veb-serverlə məlumat mübadiləsi üçün hansı yuxarı səviyyəli protokoldan istifadə etmək lazım olduğunu göstərir. Adətən bu HTTP-dir, ancaq digər protokollar da istifadə oluna bilər. Məsələn, HTTPS protokolu. Bu protokol bəd əməllərdən qorunmaq üçün məlumatı xüsusi şifrələnmiş formada ötürməyə imkan verir, ancaq bunun üçün Veb-server bununla işləməyi bacarmalıdır. Qeyd etmək lazımdır ki, bütün buna bənzər protokollar TCP vasitəsilə təqdim edilən servisə əsaslanır və çox vaxt özlüyündə sadəcə yazı formasında müəyyən əmrlər toplusunu təşkil edir. İrəlidə HTTP-in necə işlədiyi haqqında danışarkən bunun əyani şahidi olacağıq.

World Wide Web və URL

Müasir dövrdə İnternetin ən məşhur servisi World Wide Webdir. Buna bəzən WWW və ya Web (Azərbaycan dilində – Veb) də deyilir. Hər üç termin eyni mənanı daşıyır. Demək olar ki, Şəbəkədəki serverlədin çoxu WWW-i və onunla əlaqəli HTTP protokolunu (Hypertext Transfer Protocol söz birləşməsinin abreviaturası) dəstəkləyir. Bu servis ona görə məşhurdur ki, onun vasitəsilə hostlarda saytlar, mətn və istənilən digər məlumatlar toplusu yaratmaq mümkündür və bu məlumatlar istifadəçi tərəfindən interaktiv rejimdə baxıla, əldə edilə bilinir.

Çox güman ki, hər birimiz heç olmasa bir dəfə brauzerdə “adres” yazmışıq. Bu adres URL (Universal Resource Locator) adlanır və ümumi mənada adi adresdən daha geniş mənaya malikdir. Bəs DNS adres varsa URL nəyə lazımdır? Təkcə DNS adres kifayət etmirmi?

Əslində cavab aydın olaraq göz qabağındadır. Hər bir Veb-sayt adətən çox sayda səhifə və sənədlərdən ibarət olur və istifadəçiyə göstərilən host daxilində konkret sənədə müraciət etmək üçün mexanizm lazımdır. Bu URL-dir.

Ümumi halda URL aşağıdakı kimidir:
http://site.com:80/path/to/document.html

Növbəti bölmələrdə URL-in məntiqi hissələrinə bir az ətraflı nəzər yetiriləcək.