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
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_admin
və password
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
, age
və password
-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:
$values
adlı boş massiv yaradırıq- İcazə verilmiş xanaların adını özündə saxlayan
$allowedFields
massivi yaradırıq $_SERVER['REQUEST_METHOD']
dəyişəni vasitəsilə html formanınPOST
metodu ilə göndərilməsinə əmin oluruqforeach
dövr operatorunun köməyilə$allowedFields
massivinin elementlərinə (icazə verilmiş xanalara) müraciət edirikarray_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ətistrval()
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"
və"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.
Şərh yazmaq üçün hesabınıza daxil olun.