PHP

GET metodu

Kliyent-server arxitekturası

Veb HTTP protokolu əsasında işləyir: kliyent (çox vaxt brauzer) HTTP protokolu ilə serverə (məsələn, Apache, Nginx) sorğu (request) göndərir. Server, həmçinin eyni protokol ilə sorğuya cavab (response) geri qaytarır.

kliyent-server

HTTP sorğulara baxış

Brauzerin ünvan sətrinə hər hansı saytın adını yazıb Enter düyməsinə sıxdıqda veb serverə GET metodu üzrə HTTP sorğu göndərilir. HTTP sorğular brauzerdə istifadəçidən gizlədilib. Məsələn, "Chrome" brauzerində HTTP sorğulara baxmaq üçün aşağıdakı addımları etmək lazımdır:

  1. F12 düyməsinə sıxırıq
  2. Сеть (Network) seçirik
  3. Все (All) seçirik
  4. Məsələn, php.net saytına daxil oluruq
  5. Название (Name) bölməsindən "www.php.net" seçirik
  6. "Заголовки" (Headers) seçirik

Yuxarıdakı şəkildən göründüyü kimi https://php.net saytının yerləşdiyi veb serverə sorğu GET metodu ilə göndərilib.

GET metodu

"phpbasics" qovluğunda user.php faylı yaradıb ona aşağıdakı kodu əlavə edirik:

<?php

if (isset($_GET['name'])) {
    echo $_GET['name'];
}

Brauzerin ünvan sətrinə http://phpbasics/user.php yazıb Enter düyməsinə sıxırıq. Lakin ekranda heç nə görsənmir.

İndi isə brauzerin ünvan sətrinə http://phpbasics/user.php?name=Emil yazıb Enter düyməsinə sıxırıq:

Bəli, indi brauzerdə Emil görsənir. Beləliklə, GET metodu ilə serverə parametrlər göndərmək mümkündür. Parametrlər ? simvolundan sonra göndərilir. name=Emil sorğu sətri (query string) adlanır, burada name parametr, Emil isə onun qiymətidir.

GET metodu ilə serverə göndərilən sorğuda bütün parametrlər $_GET superqlobal massivində saxlanılır. $_GET superqlobal massivi skriptin istənilən hissəsində əlçatandır.

Gəlin var_dump() ilə $_GET superqlobal massivinin tərkibini ekrana çıxaraq. Bunun üçün user.php faylındakı əvvəlki kodu silib ona aşağıdakı kodu əlavə edirik:

<?php

var_dump($_GET);

İndi yenidən http://phpbasics/user.php?name=Emil URL ünvanına daxil oluruq. Nəticə:

array (size=1)
  'name' => string 'Emil' (length=4)

Bəli, massivdir. $_GET superqlobal massivinin elementlərinə adi massivdə olduğu kimi müraciət edə bilərik. Məsələn, http://phpbasics/user.php?name=Emil URL ünvanında serverə name parametri göndərilir. name parametrinin qiymətinə aşağıdakı kimi müraciət edə bilərik:

<?php

echo $_GET['name'];

Nəticə:

Əgər GET metodu ilə serverə bir neçə parametr göndərmək lazımdırsa, onlar & (ampersand) simvolu ilə bir-birindən ayrılır. Məsələn, brauzerin ünvan sətrinə http://phpbasics/user.php?name=Emil&age=35 yazıb Enter düyməsinə sıxdıqda GET metodu ilə serverə 2 parametr göndərilir:

array (size=2)
  'name' => string 'Emil' (length=4)
  'age' => string '35' (length=2)

GET metodu ilə serverə göndərilən parametrlərin URL ünvana əllə daxil edilməsi əlbəttə ki rahat deyil. HTML formalardan istifadə daha rahat və məqsədə uyğundur. Biz formanı doldurub müvafiq düyməyə sıxdıqda brauzer formaya daxil edilmiş məlumatları URL ünvana əlavə edib serverə sorğu göndərir.

HTML formalar işimizi asanlaşdırır

İstifadəçi ilə server arasında qarşılıqlı əlaqə yaratmaq üçün HTML formalardan istifadə edilir. "phpbasics" qovluğunda user.html faylı yaradıb ona aşağıdakı HTML kodu əlavə edirik:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>GET metodu</title>
</head>
<body>

<form action="user.php" method="get">
    <p>Adınız: <input type="text" name="name"></p>
    <p>Yaşınız: <input type="number" name="age"></p>
    <p><input type="submit" value="Göndər"></p>
</form>

</body>
</html>

Nəticə:

Form elementində (<form>) göstərilmiş actionmethod vacib atributlardır. action atributu formadakı məlumatları emal edən skriptin ünvanını göstərmək üçün lazımdır. Bizim nümunəmizdə bu, user.php faylıdır. method atributu formadakı məlumatların hansı metodla göndərilməsini müəyyənləşdirir. Bizim nümunəmizdə GET metodu ilə göndərilir. Yadda saxlayın ki, əgər method atributunun qiyməti göstərilməyibsə, onda başlanğıc ayar kimi GET metodu tətbiq olunur.

Formadakı məlumatların emal edilməsi

user.php faylındakı əvvəlki kodu silirik və aşağıdakı kodu əlavə edirik:

<?php

echo $_GET['name'];
echo '<br>';
echo $_GET['age'];

İndi isə brauzerdə http://phpbasics/user.html URL ünvanına daxil olub formanı doldururuq. Mən HTML formaya Emil və 35 daxil edirəm. Siz öz adınızı və yaşınızı daxil edə bilərsiniz:

Göndər düyməsinə sıxırıq:

Yenidən http://phpbasics/user.html URL ünvanına daxil oluruq. Bu dəfə formanı doldurmuruq və Göndər düyməsinə sıxırıq. Bəli, brauzerdə heç nə görsənmir, çünki GET metodu ilə serverə göndərilən parametrlərin qiyməti yoxdur: name=&age=

Bəs əgər hansısa qabaqcıl bir istifadəçi sorğu sətrindəki parametrlərdən birini (məsələn, age) silsə, nə baş verəcək? Bu zaman PHP age parametrini $_GET superqlobal massivinə əlavə etməyəcək və skript $_GET['age']-ə müraciət etdikdə, xəta qeydə alınacaq:

İndi necə edək? Sadəcə olaraq sorğu sətrindəki parametrlərin $_GET superqlobal massivində olmasını yoxlamaq lazımdır. array_key_exists() funksiyasından istifadə edirik. Buna görə user.php faylında koda dəyişiklik edirik:

<?php

$name = array_key_exists('name', $_GET) ? $_GET['name'] : '';
$age = array_key_exists('age', $_GET) ? $_GET['age'] : '';

if ($name) {
    echo 'Adım: ' . $name;
} else {
    echo 'Adınızı daxil etməmisiniz';
}

echo '<br>';

if ($age) {
    echo 'Yaşım: ' . $age;
} else {
    echo 'Yaşınızı daxil etməmisiniz';
}

Yuxarıdakı skriptin iş prinsipi aşağıdakı kimi izah edilə bilər:

  1. array_key_exists() funksiyasının köməyilə sorğu sətrindəki parametrlərin (name, age) $_GET superqlobal massivində olmasını yoxlayırıq. Əgər həmin parametrlər varsa, onların qiyməti müvafiq olaraq $name$age dəyişənlərinə mənimsədilir, olmadıqda isə sözügedən dəyişənlərə boş sətir mənimsədilir.
  2. Bundan sonra if şərt operatorunun köməyilə $name$age dəyişənlərinin qiymətləri yoxlanılır. Əgər həmin dəyişənlərin qiymətləri məntiqi tipə çevrilmə vaxtı false deyillərsə, onda ekranda çap edilirlər. 

Brauzerdə http://phpbasics/user.html ünvanına daxil oluruq. Formanı boş saxlayıb, Göndər düyməsinə sıxırıq:

Yenidən sorğu sətrindəki age parametrini silib Enter düyməsinə sıxırıq:

Göründüyü kimi heç bir xəta yoxdur.

Təhlükəsizlik

Yenidən brauzerdə http://phpbasics/user.html ünvanına daxil oluruq. Formanı boş saxlayıb, Göndər düyməsinə sıxırıq. Açılan səhifədə sorğu sətrinə aşağıdakı müdaxiləni edirik: name parametrinə <script>alert('hacked')</script> qiyməti veririk:

Enter düyməsinə sıxırıq:

Yuxarıdakı şəkildən göründüyü kimi JavaScript kodunu səhifədə yerləşdirmək mümkündür. Bu, XSS boşluq adlanır. Burda ətraflı oxuya bilərsiniz. <script>alert('hacked')</script> kodu sadəcə hacked sözünü ekrana çıxarır. Lakin saytda XSS boşluq aşkar edən kibercinayətkar  istifadəçinin adından istənilən əməliyyatları (məsələn, onun kukilərini (cookie) ələ keçirmək, spam göndərmək, istifadəçinin şəxsi məlumatlarını köçürmək, istifadəçiləri digər sayta yönləndirmək, düymələrə sıxmaq, mesajlar göndərmək kimi) yerinə yetirə bilər.

Sözügedən boşluqla mübarizə üsulu htmlspecialchars() funksiyasından istifadə etməkdir. htmlspecialchars funksiyası <, >, ", ', & xüsusi simvollarını HTML mnemonikasına (xüsusi simvolları göstərən xüsusi kodlar) çevirir və onlar veb səhifədə adi mətn kimi görsənirlər.

Nəticə etibarilə user.php faylının koduna dəyişlik edirik:

<?php

$name = array_key_exists('name', $_GET) ? trim(htmlspecialchars($_GET['name'], ENT_QUOTES)) : '';
$age = array_key_exists('age', $_GET) ? abs((int)$_GET['age']) : '';

if ($name) {
    echo 'Adım: ' . $name;
} else {
    echo 'Adınızı daxil etməmisiniz';
}

echo '<br>';

if ($age) {
    echo 'Yaşım: ' . $age;
} else {
    echo 'Yaşınızı daxil etməmisiniz';
}

Yuxarıdakı koda diqqət etdikdə görmək olar ki, XSS boşluğun aradan qaldırılması üçün htmlspecialchars() funksiyasından istifadə edilib. İstifadəçi tərəfindən html formaya daxil edilən ad htmlspecialchars() funksiyasının köməyilə zərərsizləşdirilir. trim() funksiyası istifadəçi tərəfindən daxil edilən məlumatları boşluq simvollarından təmizləyir. Aydındır ki, istifadəçinin yaşı ədəd olmalıdır, həm də müsbət! Buna görə html formada yaş xanasına daxil edilən qiymət ilk əvvəl int tipinə, sonra abs() funksiyasının köməyilə müsbət (əgər xanaya mənfi ədəd daxil edilibsə) ədədə çevrilir.

Yenidən brauzerdə http://phpbasics/user.html ünvanına daxil oluruq. Formanı aşağıdakı kimi doldururuq:

Göndər düyməsinə sıxırıq:

Yuxarıdakı şəkildən göründüyü kimi, name parametrinə <script>alert('hacked')</script> qiyməti verilib, ancaq htmlspecialchars() funksiyası XSS boşluğun qarşısını alır, JavaScript kodu icra olunmur, sadəcə ekranda çap edilir. age parametrinə isə -36 qiyməti verilib, lakin biz onu abs() funksiyasının köməyilə müsbət ədədə çevirmişik.

Hələlik bu qədər.

0

Şərh yazmaq üçün hesabınıza daxil olun.