PHP

POST metodu

Ötən dərsdə GET metodu ilə işləməyi öyrəndik. Artıq bildiyimiz kimi bu metodun köməyilə məlumatları serverə ötürmək üçün brauzerin ünvan sətrində parametrlərdən istifadə edilir. Məsələn, təsəvvür edək ki, siz https://vebkurs.info saytından aktiv istifadə edirsiniz və təhlükəsizliklə bağlı məqalələrin aşağıdakı bağlantıda yerləşdiyini bilirsiniz: https://vebkurs.info/blog?heading=&category_id=5. Günlərin birində dostunuz və ya tanışınız sizdən təhlükəsizliklə bağlı məqalələrdən ibarət mənbə soruşduqda ona yuxarıdakı bağlantını göndərirsiniz. Bu qədər sadə və rahat. GET metodundan əsasən saytlarda reallaşdırılmış filtr, axtarış forması, menyu, digər səhifələrə keçid üçün istifadə edilir.

Aydındır ki, brauzerin ünvan sətrində (URL) parametrlər vasitəsilə serverə məxfi informasiya ötürmək düzgün deyil, çünki istənilən şəxs həmin informasiyanı görə və ona müdaxilə edə bilər. Bəs bu vəziyyətdə nə edək deyə soruşa bilərsiniz? POST metodundan istifadə etmək lazımdır!

POST metodundan istifadə zamanı parametrlər brauzerin ünvan sətrində deyil, sorğunun "bədənində" ötürülür. Sorğunun "bədəni" dedikdə serverə ötürülən məlumatlar nəzərdə tutulur.

HTML forma üzərindən məlumatları POST metodu ilə göndərmək üçün method atributunun qiymətini post təyin etmək lazımdır.

"phpbasics" qovluğunda artıq mövcud olan user.html faylını açırıq və onun koduna dəyişlik edirik:

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

<form action="user.php" method="post">
    <p>Ad: <input type="text" name="name"></p>
    <p>Yaş: <input type="number" name="age"></p>
    <p>Şifrə: <input type="password" name="password"></p>
    <p><input type="submit" value="Göndər"></p>
</form>

</body>
</html>

Brauzerdə görünüş:

Yuxarıdakı koddan göründüyü kimi method atributunun qiyməti post təyin edilib. Formadakı məlumatları action atributunda göstərilmiş user.php faylı emal edir. Həmçinin user.php faylının koduna dəyişiklik edirik:

<?php

var_dump($_POST);

İndi isə brauzerdə http://phpbasics/user.html URL ünvanına daxil olub formanı doldururuq. Mən öz adımı, yaşımı və şifrəmi yazıram. Siz, həmçinin öz məlumatlarınızı daxil edə bilərsiniz:

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

HTML forma üzərindən POST metodu ilə göndərilən məlumatlar PHP-də $_POST superqlobal massivində saxlanılır. Bunu daha yaxşı başa düşmək aşağıdakı şəklə diqqət yetirin:

Yuxarıdakı şəkildən göründüyü kimi formanın hər bir xanasının adı (bizim nümunədə name, age, password) $_POST superqlobal massivinin indeksi, istifadəçi tərəfindən daxil edilmiş məlumatlar isə həmin massivin elementləri rolunda çıxış edirlər.

$_POST superqlobal massivi skriptin istənilən hissəsində əlçatandır. Aydındır ki, $_POST superqlobal massivinin elementlərinə adi massivdə olduğu kimi müraciət edə bilərik. user.php faylına dəyişlik edirik:

<?php

echo $_POST['name'];
echo '<br>';

echo $_POST['age'];
echo '<br>';

echo $_POST['password'];

Yenidən brauzerdə http://phpbasics/user.html URL ünvanına daxil olub formanı doldururuq və Göndər düyməsinə sıxırıq:

Lakin html formada çoxlu xana ola bilər. Bu halda $_POST superqlobal massivinin elementlərinə yuxarıdakı kodda olduğu kimi bir-bir müraciət etmək effektivsizdir. Biz bu məqsədlə foreach dövr operatorundan istifadə edə bilərik. Bundan başqa, html formanın həqiqətən POST metodu ilə göndərilməsinə əmin olmaq üçün $_SERVER['REQUEST_METHOD'] dəyişənindən istifadə etməyi tövsiyə edirəm. Buna görə user.php faylının koduna dəyişiklik edirik:

<?php

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    foreach ($_POST as $field => $value) {
        echo $field . ": " . $value . "<br>";
    }
}

Növbəti dəfə brauzerdə http://phpbasics/user.html URL ünvanına daxil olub formanı doldururuq və Göndər düyməsinə sıxırıq:

POST metodu ilə göndərilmiş sorğunun "bədənini" necə görə bilərik?

Brauzerdə (məsələn, Google Chrome) POST metodu ilə göndərilmiş sorğunun məlumatlarını görmək üçün aşağıdakı addımları etmək lazımdır:

  • İlk öncə brauzerdə http://phpbasics/user.html URL ünvanına daxil oluruq
  • F12 düyməsinə sıxırıq
  • Сеть (Network) seçirik
  • Все (All) seçirik
  • Formadakı xanaları doldurub Göndər düyməsinə sıxırıq
  • Название (Name) bölməsindən "user.php" (bizim nümunəmizdə html formadan göndərilmiş istifadəçi məlumatlarını bu skript emal edir) seçirik
  • Sağ hissədən "Полезная нагрузка" vərəqini seçirik
  • Nəhayət, "Данные форм" hissəsində POST metodu ilə serverə göndərilmiş sorğunun məlumatlarını görə bilərsiniz

POST sorğunun bədəni

Təhlükəsizlik

Bir qədər yuxarıda $_POST superqlobal massivinin elementlərinə müraciət etmək üçün foreach dövr operatorundan istifadə etmişdik:

<?php

foreach ($_POST as $field => $value) {
        echo $field . ": " . $value . "<br>";
}

Yuxarıdakı kod təhlükəsiz deyil, çünki bədniyyətli biri html formanın xanasının adını dəyişə və skriptin işinə müdaxilə edə bilər. Məsələn, deyək ki sizin verilənlər bazasında yaratdığınız users cədvəlində id, name, age, is_adminpassword sütunları var. is_admin adlı sütunun qiyməti 1-ə bərabər olduqda, istifadəçi saytın admin panelinin idarəetməsinə giriş əldə edə bilər.

Gəlin bunu təcrübədə yoxlayaq. Brauzerdə http://phpbasics/user.html URL ünvanına daxil olub Ad xanasının içərisində mausun sağ düyməsinə sıxırıq və açılan menyudan "Просмотреть код" seçirik:

user.html veb səhifəsinin mənbə kodu əlçatan olur:

Mənbə kodu vasitəsilə html formada name xanasının adını is_admin edirik, formanı doldururuq (diqqət edin, Ad xanasına 1 daxil edirik) və Göndər düyməsinə sıxırıq:

Və skriptimiz bu məlumatı verilənlər bazasında users cədvəlinə yazsa, onda istifadəçi saytın admin panelinin idarəetməsinə giriş əldə edə bilər.

Bildiyimiz kimi, user.html formasındakı xanaların adları name, agepassword-dur. Biz sözügedən html forma üzərindən POST metodu ilə göndərilmiş məlumatların yalnız həmin xanalardan göndərilməsinə əmin olmalıyıq. Buna görə user.php skriptinə koduna dəyişlik edirik:

<?php

$values = [];
$allowedFields = ['name', 'age', 'password'];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    foreach ($allowedFields as $field) {
        $values[$field] = array_key_exists($field, $_POST) ? trim(strval($_POST[$field])) : '';
    }
    
    var_dump($values);
}

Yuxarıdakı skriptin iş prinsipi aşağıdakı kimidir:

  1. $values adlı boş massiv yaradırıq
  2. İcazə verilmiş xanaların adını özündə saxlayan $allowedFields massivi yaradırıq
  3. $_SERVER['REQUEST_METHOD'] dəyişəni vasitəsilə html formanın POST metodu ilə göndərilməsinə əmin oluruq
  4. foreach dövr operatorunun köməyilə $allowedFields massivinin elementlərinə (icazə verilmiş xanalara) müraciət edirik
  5. array_key_exists() funksiyasının köməyilə $allowedFields massivindəki xanaların $_POST superqlobal massivində olmasını yoxlayırıq. Əgər varsa, həmin xananın qiyməti strval() funksiyasına ötürülür. Sözügedən funksiya xananın qiymətini sətrə çevirir. Bəli, ola bilər ki, bədniyyətli biri html formanın xanası üzərindən massiv göndərsin. trim() funksiyası isə xananın qiymətini boşluq simvollarından təmizləyir. İstifadəçi xanaya bilmədən boşluq simvolu əlavə edə bilər, ancaq kompüter üçün "Emil""Emil " sətirləri fərqlidir. Bundan sonra, $values[$field] massivinə yalnız icazə verilmiş ($allowedFields) xanaların qiyməti yazılır. Əgər html forma üzərindən göndərilmiş xana $_POST superqlobal massivində yoxdursa, onda $values[$field] massivinə boş sətir mənimsədilir.

Yenidən brauzerdə http://phpbasics/user.html URL ünvanına daxil oluruq. Mənbə kodu vasitəsilə html formada name xanasının adını is_admin edirik, formanı doldururuq (diqqət edin, Ad xanasına 1 daxil edirik) və Göndər düyməsinə sıxırıq. Yuxarıda bu əməliyyatı etmişdik:

Göründüyü kimi, bu dəfə is_admin xanası və onun qiyməti ekranda çap edilmədi, çünki is_admin xanası $allowedFields massivində yoxdur.

0

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