Internet Windows Android
Kengaytirish

Gunohsiz server php. Superglobal massiv $_SERVER

$HTTP_SERVER_VARS [o'chirildi]

(PHP 4 >= 4.1.0, PHP 5, PHP 7)

$_SERVER -- $HTTP_SERVER_VARS [o'chirildi]Server va ijro muhiti haqida ma'lumot

Tavsif

$_SERVER o'zgaruvchisi skript sarlavhalari, yo'llari va joylashuvi kabi ma'lumotlarni o'z ichiga olgan massivdir. Ushbu massivdagi yozuvlar veb-server tomonidan yaratilgan. Har bir veb-server ulardan birini taqdim etishiga kafolat yo'q; server ulardan ba'zilarini o'tkazib yuborishi yoki bu erda ro'yxatga olinmagan boshqalarini taqdim etishi mumkin. Biroq, bu o'zgaruvchilarning ko'pchiligi » CGI/1.1 spetsifikatsiyasida mavjud, shuning uchun ularni maxsus veb-serveringizda amalga oshirilishini kutishingiz mumkin.

$HTTP_SERVER_VARS o'zgaruvchisi bir xil dastlabki ma'lumotlarni o'z ichiga oladi, lekin u superglobal emas. (E'tibor bering, $HTTP_SERVER_VARS va $_SERVER turli xil o'zgaruvchilardir, shuning uchun PHP ularga mos ravishda munosabatda bo'ladi). Shuni ham yodda tutingki, "uzun massivlar" PHP 5.4.0 da olib tashlangan, shuning uchun $HTTP_SERVER_VARS endi mavjud emas.

Indekslar

Siz $_SERVER massivida quyidagi elementlardan birini topa olmaysiz yoki topa olmaysiz. E'tibor bering, agar mavjud bo'lsa, PHP buyruq satrida ishlayotgan bo'lsa, bir nechta elementlar mavjud bo'ladi (yoki haqiqatan ham farq qiladi).

"PHP_SELF" Hujjat ildiziga nisbatan hozirda ishlayotgan skript faylining nomi. Misol uchun, http://example.com/foo/bar.php manzilidagi skriptdagi $_SERVER["PHP_SELF"] /foo/bar.php bo'ladi. __FILE__ doimiysi joriy (ya'ni ulangan) faylning to'liq yo'li va fayl nomini o'z ichiga oladi. Agar PHP buyruq satrida ishlayotgan bo'lsa, bu o'zgaruvchi PHP 4.3.0 dan boshlab skript nomini o'z ichiga oladi. Ilgari u mavjud emas edi."argv" Skriptga bir qator argumentlar uzatildi. Skript buyruq satrida ishga tushirilganda, u C-ga o'xshash buyruq qatori parametrlariga kirish imkonini beradi. GET usuli orqali chaqirilganda, bu massiv so'rovlar qatorini o'z ichiga oladi."argc" Skriptga o'tkazilgan parametrlar sonini o'z ichiga oladi (agar buyruq satrida ishga tushirilsa).“GATEWAY_INTERFACE” Server tomonidan ishlatiladigan CGI spetsifikatsiyasining versiyasini o'z ichiga oladi; masalan" CGI/1.1". “SERVER_ADDR” Joriy skript ishlayotgan serverning IP manzili.“SERVER_NAME” Joriy skript ishlayotgan xost nomi. Agar skript virtual xostda ishlayotgan bo'lsa, unda ushbu virtual xost uchun belgilangan nom bo'ladi."SERVER_SOFTWARE" So'rovga javob kelganda sarlavhalarda ko'rsatilgan server identifikatsiya qatori.“SERVER_PROTOCOL” Sahifa so'ralgan axborot protokolining nomi va versiyasi; masalan " HTTP/1.0"; “REQUEST_METHOD” Sahifani so'rash uchun qanday usul ishlatilgan; masalan " OLISH", "BOSH", "POST", "PUT".

Izoh:

PHP skripti sarlavhalar yuborilgandan so'ng (ya'ni chiqishni buferlashsiz har qanday chiqishni amalga oshirgandan so'ng) chiqadi, agar so'rov ushbu usul yordamida amalga oshirilgan bo'lsa. BOSH.

“REQUEST_TIME” So'rov boshlanishining vaqt tamg'asi. PHP 5.1.0 dan boshlab mavjud.“REQUEST_TIME_FLOAT” Soʻrov boshlanishining vaqt tamgʻasi, mikrosoniyalargacha aniq. PHP 5.4.0 dan boshlab mavjud.“QUERY_STRING” Agar mavjud bo'lsa, sahifani olgan so'rovlar qatori.“DOCUMENT_ROOT” Joriy skript bajariladigan hujjatning ildiz katalogi aynan server konfiguratsiya faylida ko'rsatilgan katalogdir.“HTTP_ACCEPT” Sarlavha tarkibi Qabul qiling: mavjud so'rovdan, agar mavjud bo'lsa."HTTP_ACCEPT_CHARSET" Sarlavha tarkibi Qabul qilish-Charset: mavjud so'rovdan, agar mavjud bo'lsa. Masalan: " iso-8859-1,*,utf-8". "HTTP_ACCEPT_ENCODING" Sarlavha tarkibi Qabul qilish-kodlash: gzip". "HTTP_ACCEPT_LANGUAGE" Sarlavha tarkibi Qabul qilish tili: mavjud so'rovdan, agar mavjud bo'lsa. Masalan: " uz". “HTTP_CONNECTION” Sarlavha tarkibi Ulanish: mavjud so'rovdan, agar mavjud bo'lsa. Masalan: " Tirik turing". “HTTP_HOST” Sarlavha tarkibi Xost: mavjud so'rovdan, agar mavjud bo'lsa.“HTTP_REFERER” Foydalanuvchining brauzerini ushbu sahifaga olib kelgan sahifaning manzili (agar mavjud bo'lsa). Ushbu sarlavha foydalanuvchining veb-brauzeri tomonidan o'rnatiladi. Uni hamma brauzerlar o‘rnatmaydi va ba’zilari qo‘shimcha funksiya sifatida HTTP_REFERER sarlavhasi mazmunini o‘zgartirishga imkon beradi. Bir so'z bilan aytganda, unga haqiqatan ham ishonish mumkin emas."HTTP_USER_AGENT" Sarlavha tarkibi Foydalanuvchi-Agent: mavjud so'rovdan, agar mavjud bo'lsa. Ushbu qatorda foydalanuvchi ushbu sahifani so'rash uchun foydalangan brauzer mavjud. Oddiy misol - bu qator: Mozilla/4.5 (X11; U; Linux 2.2.9 i586). Boshqa narsalar qatorida, siz ushbu qiymatni funksiya bilan ishlatishingiz mumkin get_browser() sahifangizning chiqishini foydalanuvchi brauzerining imkoniyatlariga moslashtirish uchun"HTTPS" Agar so'rov HTTPS protokoli orqali qilingan bo'lsa, bo'sh bo'lmagan qiymatni qabul qiladi.

Izoh: E'tibor bering, ISAPI-ni IIS bilan ishlatganda qiymat bo'ladi o'chirilgan, agar so'rov HTTPS orqali amalga oshirilmagan bo'lsa.

“REMOTE_ADDR” Foydalanuvchi joriy sahifani ko'rayotgan IP manzili.“REMOTE_HOST” Foydalanuvchi joriy sahifani ko'rayotgan masofaviy xost. Teskari DNS qidiruvi REMOTE_ADDR o‘zgaruvchisining qiymatiga asoslanadi.

Izoh: Ushbu o'zgaruvchini yaratish uchun veb-serveringiz sozlangan bo'lishi kerak. Misol uchun, Apache'da sizga direktivaning mavjudligi kerak HostnameLookups yoqilgan httpd.conf faylida bu o'zgaruvchi yaratiladi. Shuningdek qarang gethostbyaddr().

“REMOTE_PORT” Veb-server bilan aloqa qilish uchun foydalaniladigan masofaviy kompyuterdagi port.“REMOTE_USER” Tasdiqlangan foydalanuvchi.“REDIRECT_REMOTE_USER” Agar so'rov ichki yo'naltirilgan bo'lsa, autentifikatsiya qilingan foydalanuvchi.“SCRIPT_FILENAME”

Hozirda bajarilayotgan skriptga mutlaq yo'l.

Izoh:

Agar skript file.php yoki ../file.php kabi nisbiy yo‘l yordamida buyruq satrida (CLI) ishga tushirilsa, $_SERVER["SCRIPT_FILENAME"] o‘zgaruvchisi foydalanuvchi tomonidan belgilangan nisbiy yo‘lni o‘z ichiga oladi.

“SERVER_ADMIN” Ushbu o'zgaruvchi o'z qiymatini (Apache uchun) server konfiguratsiya faylidagi direktivadan oladi. Agar skript virtual xostda ishlayotgan bo'lsa, bu virtual xost uchun belgilangan qiymat bo'ladi.“SERVER_PORT” Veb-server ulanish uchun foydalanadigan server kompyuteridagi port. Standart sozlamalar uchun qiymat " bo'ladi. 80 "; SLL-dan foydalangan holda, masalan, bu qiymat xavfsiz HTTP ulanishlari uchun sozlanganidek bo'ladi.

Izoh: Apache 2 da jismoniy (haqiqiy) portni olish uchun siz o'rnatishingiz kerak UseCanonicalName = Yoqilgan Va UseCanonicalPhysicalPort = Yoqilgan, aks holda bu qiymat almashtirilishi mumkin va jismoniy portning haqiqiy qiymatini qaytarmaydi. Kengaytirilgan xavfsizlikni talab qiladigan ilovalar kontekstida bu qiymatga tayanish xavfsiz emas.

“SERVER_SIGNATURE” Agar yoqilgan bo'lsa, server tomonidan yaratilgan sahifalarga qo'shiladigan server versiyasi va virtual xost nomini o'z ichiga olgan qator.“PATH_TRANSLATED” Fayl tizimi (hujjat ildizi emas) asosidagi joriy skriptga yo'l, server virtualdan realga har qanday xaritalashni amalga oshirgandan so'ng.

Izoh: PHP 4.3.2 dan boshlab, PATH_TRANSLATED o‘zgaruvchisi Apache 1-versiyasi bilan solishtirganda endi Apache 2 SAPI da bilvosita o‘rnatilmaydi, bunda u Apache tomonidan foydalanilmaganda SCRIPT_FILENAME o‘zgaruvchisi bilan bir xil qiymatga o‘rnatilgan edi. Ushbu o'zgartirish CGI spetsifikatsiyasiga muvofiq amalga oshirildi, bunda PATH_TRANSLATED o'zgaruvchisi faqat PATH_INFO aniqlanganda mavjud bo'lishi kerak. Apache 2 foydalanuvchilari direktivadan foydalanishlari mumkin AcceptPathInfo = Yoqilgan PATH_INFO o'zgaruvchisini o'rnatish uchun httpd.conf konfiguratsiya faylida.

“SCRIPT_NAME” Joriy bajarilayotgan skriptga yo'lni o'z ichiga oladi. Bu o'zlariga ishora qilishi kerak bo'lgan sahifalar uchun foydalidir. __FILE__ doimiysi joriy (ya'ni kiritilgan) faylning to'liq yo'li va nomini o'z ichiga oladi.“REQUEST_URI” Ushbu sahifaga kirish uchun yuborilgan URI. Masalan, " /index.html". "PHP_AUTH_DIGEST" HTTP Digest autentifikatsiyasini amalga oshirayotganda, bu o'zgaruvchiga mijoz tomonidan yuboriladigan "Avtorizatsiya" sarlavhasi tayinlanadi (bu keyinchalik tegishli tekshirish uchun ishlatilishi kerak).“PHP_AUTH_USER” HTTP autentifikatsiyasi amalga oshirilganda, bu o'zgaruvchi foydalanuvchi tomonidan taqdim etilgan foydalanuvchi nomiga o'rnatiladi."PHP_AUTH_PW" HTTP autentifikatsiyasi amalga oshirilganda, bu o'zgaruvchi foydalanuvchi tomonidan taqdim etilgan parolga o'rnatiladi.“AUTH_TYPE” HTTP autentifikatsiyasi amalga oshirilganda, bu o'zgaruvchi foydalanilayotgan autentifikatsiya turiga o'rnatiladi.“PATH_INFO” Skript nomidan keyin, lekin agar mavjud bo'lsa, so'rovlar qatoridan oldin bo'lgan foydalanuvchi tomonidan taqdim etilgan har qanday yo'lni o'z ichiga oladi. Misol uchun, agar joriy skript http://www.example.com/php/path_info.php/some/stuff?foo=bar URL orqali so'ralsa, $_SERVER["PATH_INFO"] o'zgaruvchisi o'z ichiga oladi. / ba'zi / narsalar?>

Ushbu misolni ishga tushirish natijasi shunga o'xshash bo'ladi.

Birinchidan, biz avatarni yuklash imkoniyatini qo'shish orqali ro'yxatdan o'tish sahifasini yaxshilaymiz. Manba tasviri jpg, gif yoki png formatida bo'lishi kerak. Bundan tashqari, u 2 MB dan oshmasligi kerak. Xavotir olmang, u skript tomonidan siqilgandan so'ng, avatar hajmi taxminan 3 kb va jpg formatida bo'ladi. Sahifani oching reg.php va uni tegga qo'shing < shakl> chiziq enctype = "ko'p qismli/form-ma'lumotlar", misoldagi kabi:


Roʻyxatdan oʻtish










Endi tejaylik reg.php

2.Keyin jadvalda boshqa maydon yaratishingiz kerak foydalanuvchilar. Keling, boraylik phpmyadmin, kerakli ma'lumotlar bazasi va jadvalni tanlang.


Biz barcha qiymatlarni rasmdagi kabi o'rnatamiz:

Avatarga boradigan yo'l ushbu maydonda qayd etiladi va u alohida papkada saqlanadi, keling, uni "avatarlar" deb ataymiz. Jild qolgan skript fayllari bilan bir xil katalogda joylashgan bo'ladi.

3. Faylga o'ting saqlash_ foydalanuvchi. php login va paroldan bo'sh joylarni olib tashlaganingizdan so'ng quyidagi kodni qo'shing:

//qo'shimcha bo'shliqlarni olib tashlang
$login = trim($login);

// yangi ******************************************** qo'shing

//login va parol uzunligi uchun chek qo'shing
agar (strlen($login)< 3 or strlen($login) > 15) {
exit("Login kamida 3 ta belgidan va 15 tadan oshmasligi kerak.");
}
agar (strlen($parol)< 3 or strlen($password) > 15) {
exit("Parol kamida 3 ta belgidan va 15 ta belgidan oshmasligi kerak.");
}

agar (!empty($_POST["fupload"])) //foydalanuvchi rasm yuborganligini tekshiring
{
$fupload=$_POST["fupload"]; $fupload = trim ($fupload);
agar ($fupload =="" yoki bo'sh ($fupload)) (
unset($fupload);// agar $fupload o'zgaruvchisi bo'sh bo'lsa, uni o'chiring
}
}
agar (!isset($fupload) yoki bo'sh ($fupload) yoki $fupload =="")
{
//agar o'zgaruvchi mavjud bo'lmasa (foydalanuvchi rasm yubormagan), unga "avatar yo'q" yozuvi bilan oldindan tayyorlangan rasmni tayinlang.
$avatar = "avatars/net-avatara.jpg"; //siz net-avatara.jpg ni chizishingiz yoki uni manbadan olishingiz mumkin
}
boshqa
{
//aks holda - foydalanuvchi tasvirini yuklang
$path_to_90_directory = "avatars/";//dastlabki rasm va uning siqilgan nusxasi yuklanadigan papka

If(preg_match("/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/",$_FILES["fupload"]["name"])) // manba tasvir formatini tekshirish
{
$filename = $_FILES["fupload"]["name"];
$source = $_FILES["fupload"]["tmp_name"];
$target = $path_to_90_directory . $filename;
move_uploaded_file($source, $target);//asl nusxani $path_to_90_katalogiga yuklash
if(preg_match("/[.](GIF)|(gif)$/", $filename)) (
$im = imagecreatefromgif($path_to_90_directory.$filename); //agar asl nusxa gif formatida bo'lsa, xuddi shu formatda rasm yarating. Keyingi siqilish uchun zarur
}
if(preg_match("/[.](PNG)|(png)$/", $filename)) (
$im = imagecreatefrompng($path_to_90_directory.$filename) ;//agar asl nusxa png formatida boʻlsa, rasmni bir xil formatda yarating. Keyingi siqilish uchun zarur
}

If(preg_match("/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/", $filename)) (
$im = imagecreatefromjpeg($path_to_90_directory.$filename); //agar asl jpg formatida bo'lsa, xuddi shu formatda rasm yarating. Keyingi siqilish uchun zarur
}
//Kvadrat TASVIRNI YARATISH VA UNING KEYINDAN SIQTISH www.codenet.ru SAYTIDAN OLINDI.
// 90x90 kvadrat yarating
// dest - natijada olingan tasvir
// w - tasvir kengligi
// nisbat - mutanosiblik koeffitsienti
$w = 90; // kvadrat 90x90. Boshqa o'lchamlarda etkazib berilishi mumkin.
// asosida asl tasvirni yaratish
// manba fayli va uning hajmini aniqlang
$w_src = imagesx($im); //kengligini hisoblang
$h_src = tasviriy($im); //tasvir balandligini hisoblash
// bo'sh kvadrat rasm yaratish
// truecolor muhim!, aks holda biz 8 bitli natijaga ega bo'lamiz
$dest = imagecreatetruecolor($w,$w);
// agar fotosurat gorizontal bo'lsa, kvadrat markazini x dan kesib oling
agar ($w_src>$h_src)
imagecopyresampled($dest, $im, 0, 0,
davra ((maksimal($w_src,$h_src)-min($w_src,$h_src))/2),
0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));
// y bo'ylab kvadrat tepani kesib oling,
// agar fotosurat vertikal bo'lsa (garchi siz o'rtasini ham ishlatishingiz mumkin)
agar ($w_src<$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w,
min($w_src,$h_src), min($w_src,$h_src));
// kvadrat tasvir kesilmasdan masshtablangan
agar ($w_src==$h_src)
imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);
$sana=vaqt(); // joriy vaqtni hisoblang.
imagejpeg($dest, $path_to_90_directory.$date.".jpg");//tasvirni jpg formatida kerakli jildga saqlang, nom joriy vaqt bo'ladi. Avatarlar bir xil nomga ega bo'lishining oldini olish uchun yaratilgan.
// nima uchun jpg? U juda kam joy egallaydi + foydalanuvchini chalg'ituvchi GIF tasvirining animatsiyasi buziladi. Ko'zning burchagidan qandaydir harakatni sezsangiz, uning sharhini o'qish juda yoqimli emas.
$avatar = $path_to_90_directory.$date.".jpg";//avatarga yo'lni o'zgaruvchiga qo'ying.
$delfull = $path_to_90_directory.$filename;
uzish ($delfull);//asl yuklangan rasmni oʻchirib tashlang, endi bizga kerak emas. Vazifa miniatyura olish edi.
}
boshqa
{
//format nomuvofiq bo'lsa, tegishli xabarni bering
exit("Avatar formatda bo'lishi kerak JPG, GIF yoki PNG");
}
// yuklash jarayonining tugashi va $avatar o'zgaruvchisiga yuklangan ava manzilini belgilash
}



// yangi qo'shildi ************************************************ **
// Keyingi maqolaning birinchi qismidagi hamma narsa keladi, lekin siz ma'lumotlar bazasi so'roviga o'zgartirish kiritishingiz kerak.
// ma'lumotlar bazasiga ulanish
// bir xil loginga ega foydalanuvchi mavjudligini tekshiring
$natija = mysql_query("QAYERDA login="$login"",$db);
agar (!empty($myrow["id"])) (
exit("Kechirasiz, siz kiritgan login allaqachon ro'yxatdan o'tgan. Iltimos, boshqa login kiriting.");
}
// agar bunday narsa bo'lmasa, ma'lumotlarni saqlang
$result2 = mysql_query("INSERT INTO foydalanuvchilar (login,parol,avatar) VALUES("$login","$password","$avatar")");
// Xatolar mavjudligini tekshiring
agar ($result2=="TRUE")
{
echo "Muvaffaqiyatli ro'yxatdan o'tdingiz! Endi siz saytga kirishingiz mumkin. Bosh sahifa";
}
boshqa(
echo "Xato! Siz ro'yxatdan o'tmagansiz.";
}
?>

4. Xuddi shu ma'lumotlar bazasiga bitta jadval qo'shishingiz kerak. U tizimga kirishda xatolikka yo'l qo'ygan IP manzillarini saqlaydi. Shunday qilib, biz taxminan 15 daqiqa davomida ketma-ket uch martadan ko'proq xato qilganlarga kirishni cheklashimiz mumkin, menimcha, parollarni tanlaydigan dasturlar uzoq vaqt davomida o'ylashlari kerak.
Keling, phpmyadmin ga o'tamiz va 3 ta maydondan iborat yangi jadval yaratamiz:


ip - IP manzili.
sana - ushbu IP bilan foydalanuvchi uchun oxirgi 15 daqiqada muvaffaqiyatsiz kirish sanasi. col - bu IP bilan foydalanuvchi uchun oxirgi 15 daqiqadagi xatolar soni.
Ajoyib! Bajarildi, endi login va parolni tekshirish faylini o'zgartiramiz, chunki endi bizning parolimiz shifrlangan. testreg.php ni oching va login va paroldan bo'sh joylarni olib tashlashdan tashqari hamma narsani o'chiring. Keyin quyidagi kodni qo'shamiz:

//qo'shimcha bo'shliqlarni olib tashlang
$login = trim($login);
$parol = trim($parol);

// yangisi bilan almashtiring******************************************** *******
// ma'lumotlar bazasiga ulanish
include("bd.php");// bd.php fayli boshqalar bilan bir xil papkada bo'lishi kerak, agar u bo'lmasa, shunchaki yo'lni o'zgartiring.
// parol tanlash uchun mini-tekshirish
$ip=getenv("HTTP_X_FORWARDED_FOR");
agar (bo'sh($ip) || $ip=="noma'lum") ( $ip=getenv("REMOTE_ADDR"); )//ipni chiqarib oling
mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 900");//15 daqiqadan so'ng tizimga kirishda xato qilgan foydalanuvchilarning IP manzillarini o'chirish.
$result = mysql_query("SELECT col FROM oshibka WHERE ip="$ip"",$db // ma'lumotlar bazasidan ma'lum IP-ga ega bo'lgan foydalanuvchi uchun oxirgi 15 ta muvaffaqiyatsiz kirish urinishlari sonini oling);
$myrow = mysql_fetch_array($natija);
agar ($myrow["col"] > 2) (
//agar ikkitadan ortiq xato, ya'ni uchta bo'lsa, biz xabar beramiz.
exit("Siz foydalanuvchi nomi yoki parolingizni 3 marta noto'g'ri kiritdingiz. Qayta urinishdan oldin 15 daqiqa kuting.");
}
$password = md5($password);//parolni shifrlash
$password = strrev($password);// ishonchliligi uchun teskarisini qo'shing
$parol = $parol."b3p6f";
//siz o'zingizning didingizga ko'ra o'zingizning bir nechta belgilaringizni qo'shishingiz mumkin, masalan, "b3p6f" ni kiritish orqali. Agar ushbu parol bir xil md5 yordamida o'z serverida shafqatsiz kuch bilan buzilgan bo'lsa, unda hech qanday yaxshi narsa bo'lmaydi. Lekin men sizga boshqa belgilarni qo'yishni maslahat beraman, ehtimol chiziqning boshida yoki o'rtasida.
//Bu holda ma'lumotlar bazasidagi parol maydoni uzunligini oshirish kerak. Shifrlangan parol ancha katta bo'lishi mumkin.

$result = mysql_query("LOGIN ="$login" VA parol="$parol"",$db); //ma'lumotlar bazasidan foydalanuvchi haqidagi barcha ma'lumotlarni kiritilgan login va parol bilan olish
$myrow = mysql_fetch_array($natija);
agar (bo'sh($myrow["id"]))
{
//agar kiritilgan login va parolga ega foydalanuvchi mavjud bo'lmasa
//Ushbu IP tizimga kira olmagani haqida qayd qilamiz.
$select = mysql_query("Oshibka FROM IP-ni QAYoDA ip="$ip"");
$tmp = mysql_fetch_row($select);
if ($ip == $tmp) (//foydalanuvchi "oshibka" jadvalida ekanligini tekshiring
$result52 = mysql_query("Tanlash col FROM oshibka WHERE ip="$ip"",$db);
$myrow52 = mysql_fetch_array($result52);
$col = $myrow52 + 1;//yana bitta muvaffaqiyatsiz kirish urinishini qo'shing
mysql_query("YANGILASH xatosi SET col=$col,date=NOW() WHERE ip="$ip"");
}
boshqa(
mysql_query("INSERT INTO oshibka (ip,date,col) VALUES ("$ip",NOW(),"1")");
//agar oxirgi 15 daqiqada xatolik boʻlmasa, “oshibka” jadvaliga yangi yozuv kiriting.
}

exit("Kechirasiz, siz kiritgan foydalanuvchi nomi yoki parol noto'g'ri.");
}
boshqa(
nbsp; //agar parollar mos kelsa, biz foydalanuvchi uchun sessiyani ishga tushiramiz! Siz uni tabriklashingiz mumkin, u kirdi!
$_SESSION["parol"]=$mening qatorim["parol"];
$_SESSION["login"]=$myrow["login"];
$_SESSION["id"]=$myrow["id"];//bu ma'lumotlar juda tez-tez ishlatiladi, shuning uchun tizimga kirgan foydalanuvchi "uni o'zi bilan olib yuradi"

//Keyingi tizimga kirish uchun ma'lumotlarni cookie-fayllarga saqlaymiz.
//DIQQAT!!! BUNI O'Z ixtiyoringiz bo'yicha bajaring, chunki ma'lumotlar kuki-fayllarda shifrlanmasdan saqlangan.
agar ($_POST["saqlash"] == 1) (
//Agar foydalanuvchi o'z ma'lumotlarini keyingi kirish uchun saqlashni xohlasa, biz uni brauzer cookie-fayllarida saqlaymiz.
setcookie("login", $_POST["login"], time()+9999999);
setcookie("parol", $_POST["parol"], time()+9999999);
}}
aks-sado " ";//biz foydalanuvchini asosiy sahifaga yo'naltiramiz, u erda biz unga muvaffaqiyatli kirish haqida xabar beramiz
?>

5. Asosiy sahifani butunlay o'zgartiramiz. Unda foydalanuvchi avatarini ko'rsatish, hisobdan chiqish uchun havolani ko'rsatish va tizimga kirishda parolni eslab qolish uchun katakchani qo'shish kerak.
Index.php

// butun protsedura sessiyalarda ishlaydi. Bu erda foydalanuvchining ma'lumotlari u saytda bo'lganida saqlanadi. Ularni sahifaning boshida ishga tushirish juda muhim!!!
session_start();
include("bd.php");// bd.php fayli boshqalar bilan bir xil papkada bo'lishi kerak, agar u bo'lmasa, shunchaki yo'lni o'zgartiring.
agar (!empty($_SESSION["login"]) va !empty($_SESSION["parol"]))
{
//agar seanslarda login va parol bo'lsa, ularni tekshiring va avatarni oling
$login = $_SESSION["login"];
$parol = $_SESSION["parol"];
$result = mysql_query("ID, avatar FROM foydalanuvchilar FROM login="$login" VA password="$parol",$db);
$myrow = mysql_fetch_array($natija);
//kerakli foydalanuvchi ma'lumotlarini chiqarib oling
}
?>


Bosh sahifa


Bosh sahifa

agar (!isset($myrow["avatar"]) yoki $myrow["avatar"]=="") (
//foydalanuvchi ma'lumotlari ma'lumotlar bazasidan olinganligini tekshiring. Agar yo'q bo'lsa, u tizimga kirmagan yoki sessiyadagi parol noto'g'ri. Biz kirish oynasini ko'rsatamiz. Ammo biz uni kelganlar uchun ko'rsatmaymiz, ularga endi kerak emas.
chop etish<<


BU YERGA;

Agar (isset($_COOKIE["login"])) //COOKIE-da login bilan o'zgaruvchi bormi. Agar foydalanuvchi oldingi tizimga kirish paytida "Meni eslab qolish" katagiga belgi qo'ygan bo'lsa bo'lishi kerak
{
//ha bo'lsa, uning qiymatini shaklga kiriting. Bunday holda, foydalanuvchiga uning logini allaqachon kerakli ustunga kiritilganligi ko'rsatiladi
echo "value="".$_COOKIE["login"]."">";
}

chop etish<<




BU YERGA;

Agar (isset($_COOKIE["password"]))//COOKIE faylida parolli o'zgaruvchi bor yoki yo'qligini. Agar foydalanuvchi oldingi tizimga kirish paytida "Meni eslab qolish" katagiga belgi qo'ygan bo'lsa bo'lishi kerak
{
//ha bo'lsa, uning qiymatini shaklga kiriting. Bunday holda, foydalanuvchiga uning paroli allaqachon kerakli ustunga kiritilganligi ko'rsatiladi
echo "value="".$_COOKIE["parol"]."">";
}

Chop etish<<



Meni eslab qolish.






Roʻyxatdan oʻtish



Siz mehmon sifatida tizimga kirdingiz

BU YERGA;
}
boshqa
{
//agar login muvaffaqiyatli bo'lsa, foydalanuvchiga yulduzchalar orasida quyida hamma narsa beriladi.

chop etish<<
Siz saytga $_SESSION sifatida kirgansiz (chiqish)


Ushbu havola faqat ro'yxatdan o'tgan foydalanuvchilar uchun mavjud

Sizning avataringiz:




BU YERGA;

//************************************************************************************
//agar login muvaffaqiyatli bo'lsa, foydalanuvchiga yulduzchalar orasida YUQORIDA joylashgan hamma narsa beriladi.
}
?>

6. Tizimga kirgan foydalanuvchilarga tizimdan chiqish imkoniyatini yaratish kerak. Asosiy sahifada chiqish uchun havola allaqachon mavjud edi. Ammo bu fayl hali mavjud emas. Shunday qilib, yangi fayl yarataylik exit.php kod bilan:

session_start();
agar (bo'sh($_SESSION["login"]) yoki bo'sh($_SESSION["parol"]))
{
//agar login va parol bilan seans bo'lmasa, bu faylga tizimga kirmagan foydalanuvchi kirishi mumkin. U bu yerga tegishli emas. Biz xato xabarini beramiz va skriptni to'xtatamiz
chiqish (“Ushbu sahifaga faqat roʻyxatdan oʻtgan foydalanuvchilar ruxsat berilgan. Agar roʻyxatdan oʻtgan boʻlsangiz, foydalanuvchi nomi va parolingizdan foydalanib saytga kiring.
Bosh sahifa");
}

unset($_SESSION["parol"]);
unset($_SESSION["login"]);
unset($_SESSION["id"]);// seanslardagi o'zgaruvchilarni yo'q qilish
Chiqish(" ");
// foydalanuvchini asosiy sahifaga yuboring.
?>

OK, endi hammasi tugadi! Sog'ligingiz uchun zavqlaning! Omad!

$_SERVER["DOCUMENT_ROOT"] elementi serverning asosiy katalogiga yo'lni o'z ichiga oladi, agar skript virtual xostda bajarilgan bo'lsa, bu element virtual xostning asosiy katalogiga yo'lni belgilaydi. Bular. httpd.conf konfiguratsiya faylida virtual xost "D:/main" ga o'rnatilgan DocumentRoot direktivasiga ega, $_SERVER["DOCUMENT_ROOT"] elementi "D:main" qiymatini o'z ichiga oladi.

$_SERVER["HTTP_ACCEPT"] elementi

$_SERVER["HTTP_ACCEPT"] elementi mijozning hujjat turi afzalliklarini tavsiflaydi. Ushbu elementning mazmuni mijoz tomonidan serverga yuborilgan Accept HTTP sarlavhasidan olinadi. Ushbu sarlavhaning mazmuni shunday ko'rinishi mumkin

Rasm/gif, rasm/x-xbitmap, rasm/jpeg, tasvir/pjpeg, ilova/x-shockwave-flash, application/vnd.ms-excel, ilova/msword, */*

Qabul qilish sarlavhasi mijoz so'roviga javoban olishni afzal ko'rgan media turini belgilash imkonini beradi. Ushbu sarlavha serverga javob afzal qilingan turlarning kichik to'plami bilan cheklanganligini bilish imkonini beradi.

* belgisi media seriyadagi turlarni guruhlash uchun ishlatiladi. Masalan, */* belgisi barcha turlardan foydalanishni, belgi turi/* esa tanlangan turdagi tipdagi barcha kichik tiplardan foydalanishni bildiradi.

Izoh

Media turlari vergul bilan ajratiladi.

Har bir media seriyasi, shuningdek, qo'shimcha parametrlar to'plami bilan tavsiflanadi. Ulardan biri nisbiy afzallik koeffitsienti q bo'lib, u mos ravishda 0 dan 1 gacha qiymatlarni kamroq afzal qilingan turlardan ko'proq afzal ko'rganlarga o'tkazadi. Bir nechta q parametrlaridan foydalanish mijozga serverga ma'lum bir media turiga nisbatan afzalligini aytish imkonini beradi.

Izoh

Odatiy bo'lib, q parametri 1. Shuningdek, u media turidan nuqta-vergul bilan ajratiladi.

Qabul qilish sarlavhasiga misol:

Qabul qiling: audio/*; q=0,2, audio/asosiy

Ushbu sarlavhada birinchi turdagi audio/* bo'lib, u barcha musiqiy hujjatlarni o'z ichiga oladi va 0,2 afzallik koeffitsienti bilan tavsiflanadi. Vergul bilan ajratilgan audio/asosiy turi ko'rsatilgan, buning uchun afzal koeffitsienti ko'rsatilmagan va birning standart qiymatini oladi. Ushbu sarlavhani keltirish quyidagicha talqin qilinishi mumkin: "Men audio/asosiy turni afzal ko'raman, lekin agar mavjud bo'lsa, afzallik koeffitsientini 80% dan ko'proq qisqartirgandan so'ng, boshqa har qanday audio turdagi hujjatlarni ham yuborishim mumkin."

Misol murakkabroq bo'lishi mumkin.

Qabul qilish: matn/tekislik; q=0,5, matn/html,
matn/x-dvi; q=0,8, matn/x-c

Izoh

E'tibor bering, $_SERVER["HTTP_ACCEPT"] elementi aynan bir xil ma'lumotlarni o'z ichiga oladi, lekin dastlabki Accept sarlavhasisiz.

Ushbu sarlavha quyidagicha talqin qilinadi: matn/html va text/x-c hujjat turlariga afzallik beriladi, lekin agar ular mavjud bo'lmasa, ushbu so'rovni yuborgan mijoz text/x-dvi-ni afzal ko'radi va agar mavjud bo'lmasa, u qabul qilishi mumkin. matn turi / tekis

Element $_SERVER["HTTP_ACCEPT_LANGUAGE"]

$_SERVER["HTTP_ACCEPT_LANGUAGE"] elementi mijozning til afzalligini tavsiflaydi. Ushbu ma'lumot mijoz serverga yuboradigan Accept-Language HTTP sarlavhasidan olinadi. Quyidagi misolni keltirish mumkin:

Qabul qilish tili: ru, en; q=0,7

Buni quyidagicha talqin qilish mumkin: mijoz rus tilini afzal ko'radi, ammo agar u mavjud bo'lmasa, u ingliz tilida hujjatlarni qabul qilishga rozi. $_SERVER["HTTP_ACCEPT_LANGUAGE"] elementi aynan bir xil ma'lumotlarni o'z ichiga oladi, lekin Accept-Language sarlavhasisiz:

Ru, en; q=0,7

$_SERVER["HTTP_ACCEPT_LANGUAGE"] elementining mazmuni tashrif buyuruvchilarning fuqaroligini aniqlash uchun ishlatilishi mumkin. Biroq, natijalar taxminiy bo'ladi, chunki ko'p foydalanuvchilar brauzerlarning inglizcha versiyalaridan foydalanadilar, bu esa serverga tashrif buyuruvchi faqat bitta tilni - ingliz tilini afzal ko'rishi haqida xabar beradi.

Element $_SERVER["HTTP_HOST"]

$_SERVER["HTTP_HOST"] elementi odatda serverda joylashgan sayt domen nomiga mos keladigan server nomini o'z ichiga oladi. Odatda, ushbu parametrda ko'rsatilgan nom $_SERVER["SERVER_NAME"] nomi bilan bir xil bo'ladi. Parametr faqat protokol nomisiz (http://) domen nomini o'z ichiga oladi, ya'ni.

www.sofftime.ru

Element $_SERVER["HTTP_REFERER"]

$_SERVER["HTTP_REFERER"] elementi ushbu sahifaga tashrif buyurgan sahifaning manzilini o'z ichiga oladi. O'tish havola orqali amalga oshirilishi kerak. Keling, index.php va page.php ikkita sahifa yarataylik.

index.php sahifasi

aks-sado "PHP sahifasiga havola
"
;
$_SERVER["HTTP_REFERER"]
?>

Page.php sahifasi o'xshash tarkibga ega bo'ladi, lekin havola index.php sahifasiga ishora qiladi.

Page page.php

aks-sado "PHP sahifasiga havola
"
;
echo "$_SERVER ["HTTP_REFERER"] tarkibi - " .
$_SERVER["HTTP_REFERER"]
?>

Bir sahifadan ikkinchisiga o'tishda havola ostida o'tish amalga oshirilgan sahifaning manzili ko'rsatiladi.

Element $_SERVER["HTTP_USER_AGENT"]

$_SERVER["HTTP_USER_AGENT"] elementi tashrif buyuruvchi brauzeri va operatsion tizimining turi va versiyasi haqida ma'lumotni o'z ichiga oladi.

Mana bu qatorning odatiy mazmuni: "Mozilla/4.0 (mos keladi; MSIE 6.0; Windows NT 5.1)". "MSIE 6.0" pastki qatorining mavjudligi tashrifchining Internet Explorer 6.0 versiyasidan foydalangan holda sahifani ko'rayotganligini ko'rsatadi. "Windows NT 5.1" qatori operatsion tizim Windows XP ekanligini bildiradi.

Izoh

Windows 2000 uchun $_SERVER["HTTP_USER_AGENT"] elementi quyidagicha ko'rinadi: "Mozilla/4.0 (mos; MSIE 5.01; Windows NT 5.0)"), Windows XP uchun esa "Mozilla/4.0 (mos; MSIE 6.0) kabi ko'rinadi. ;Windows NT 5.1)".

Agar tashrif buyuruvchi Opera brauzeridan foydalansa, $_SERVER["HTTP_USER_AGENT"] tarkibi quyidagicha ko'rinishi mumkin: "Mozilla/4.0 (mos; MSIE 5.0; Windows 98) Opera 6.04 ". Bu erda "MSIE 6.0" pastki qatori ham mavjud bo'lib, bu Opera brauzerining Internet Explorer brauzeri bilan mos kelishini va bir xil Windows dinamik kutubxonalaridan foydalanishini ko'rsatadi. Shuning uchun, brauzer tomonidan qaytarilgan satrni tahlil qilganda, Internet Explorer "MSIE 6.0" pastki qatorini o'z ichiga olgan va "Opera" pastki qatorini o'z ichiga olmagan qatorga ishora qilishini yodda tutishingiz kerak. Bundan tashqari, ushbu qatordan foydalanuvchi Windows 98 operatsion tizimidan foydalanmoqda degan xulosaga kelishimiz mumkin.

Izoh

Firefox brauzerining foydalanuvchi agenti quyidagicha ko'rinishi mumkin: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20051111 Firefox/1.5.

Netscape brauzeridan foydalanganda $_SERVER["HTTP_USER_AGENT"] elementining mazmuni quyidagicha ko'rinishi mumkin: "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4) Gecko/20030624 Netscape/7.1" . Ushbu brauzerga tegishli ekanligini "Netscape" pastki qatorining mavjudligi bilan aniqlash mumkin. Bundan tashqari, tashrifchi Pentium IV uchun optimallashtirilgan yadroga ega Linux operatsion versiyasidan foydalanib, X-Window grafik qobig'ida Internetga kirishini bilib olishingiz mumkin. Ushbu mexanizm statistik ma'lumotlarni to'plash uchun foydalanish uchun qulaydir, bu esa dizaynerlarga eng keng tarqalgan brauzerlar uchun sahifalarni optimallashtirish imkonini beradi.

Element $_SERVER["REMOTE_ADDR"]

$_SERVER["REMOTE_ADDR"] elementi mijozning IP manzilini o'z ichiga oladi. Mahalliy mashinada sinovdan o'tkazilganda, bu manzil 127.0.0.1 ga teng bo'ladi. Biroq, tarmoqda sinovdan o'tkazilayotganda, o'zgaruvchi mijozning IP manzilini yoki mijoz serverga yetib borgan oxirgi proksi-serverni qaytaradi. Agar mijoz proksi-serverdan foydalansa, uning IP manzilini HTTP_X_FORWARDED_FOR muhit o'zgaruvchisi yordamida bilib olishingiz mumkin, uning qiymati getenv() funksiyasi yordamida olinishi mumkin.

Izoh

Proksi-serverlar - bu maxsus xizmat turini ta'minlovchi maxsus oraliq serverlar: trafikni siqish, ma'lumotlarni kodlash, mobil qurilmalar uchun moslashish va boshqalar. Ko'pgina proksi-serverlar orasida mijozning haqiqiy IP-manzilini yashirish imkonini beruvchi anonim proksi-serverlar mavjud; bunday serverlar HTTP_X_FORWARDED_FOR muhit o'zgaruvchisini qaytarmaydi;

HTTP_X_FORWARDED_FOR muhit oʻzgaruvchisi olinmoqda

echo getenv(HTTP_X_FORWARDED_FOR);
?>

Element $_SERVER["SCRIPT_FILENAME"]

$_SERVER["SCRIPT_FILENAME"] elementi disk ildizidan faylga mutlaq yo'lni o'z ichiga oladi. Shunday qilib, agar server Windows operatsion tizimida ishlayotgan bo'lsa, unda bu yo'l shunday ko'rinishi mumkin: "d:main estindex.php", ya'ni. yo'l UNIX-ga o'xshash operatsion tizimda diskdan ko'rsatilgan, yo'l ildiz katalogidan ko'rsatilgan /, masalan, "/var/share/www/test/index.php".

Element $_SERVER["SERVER_NAME"]

$_SERVER["SERVER_NAME"] elementi odatda unda joylashgan saytning domen nomiga mos keladigan server nomini o'z ichiga oladi. Masalan,

www.sayt

$_SERVER["SERVER_NAME"] elementining mazmuni ko'pincha $_SERVER["HTTP_HOST"] elementining mazmuni bilan bir xil bo'ladi. Server nomidan tashqari, superglobal $_SERVER massivi bir qator server parametrlarini, masalan, server IP-manzilini, tinglash portini, qaysi veb-server o'rnatilganligini va HTTP protokoli versiyasini aniqlash imkonini beradi. Bu maʼlumotlar mos ravishda $_SERVER["SERVER_ADDR"], $_SERVER["SERVER_PORT"], $_SERVER["SERVER_SOFTWARE"] va $_SERVER["SERVER_PROTOCOL"] elementlariga joylashtirilgan. Quyida ushbu elementlardan foydalanish misoli keltirilgan.

$_SERVER massiv elementlaridan foydalanish

echo "Server nomi -" . $_SERVER["SERVER_NAME"]. "
" ;
aks-sado "Server IP manzili -". $_SERVER["SERVER_ADDR"]. "
" ;
echo "Server porti -" . $_SERVER["SERVER_PORT"]. "
" ;
echo "Veb-server -" . $_SERVER["SERVER_SOFTWARE"]. "
" ;
aks-sado "HTTP protokoli versiyasi -". $_SERVER["SERVER_PROTOCOL"]. "
" ;
?>

Va bu mijoz aslida so'rovning "maqsadli xosti" sifatida foydalangan. SERVER_NAME server konfiguratsiyasida belgilangan. Qaysi biri sizga kerak bo'lgan narsaga bog'liq. Endi tushunishingiz kerakki, bu mijoz tomonidan boshqariladigan qiymat, shuning uchun biznes mantig'ida foydalanish uchun ishonchli emas, ikkinchisi esa ishonchliroq bo'lgan server tomonidan boshqariladigan qiymat. Biroq, veb-server to'g'ri SERVER_NAME konfiguratsiyasiga ega ekanligiga ishonch hosil qilishingiz kerak. Misol tariqasida Apache HTTPD ni olib, uning hujjatlaridan parcha:

Agar ServerName ko'rsatilmagan bo'lsa, server IP manzilida teskari qidiruvni amalga oshirish orqali xost nomini aniqlashga harakat qiladi. Agar ServerName da port ko'rsatilmagan bo'lsa, server kiruvchi so'rovdagi portdan foydalanadi. Optimal ishonchlilik va bashorat qilish uchun siz ServerName direktivasi yordamida aniq xost nomi va portni belgilashingiz kerak.

Yangilash: Pekkaning savolingizga javobini tekshirganingizdan so'ng, bobince javobiga havola mavjud, bu PHP har doim SERVER_NAME uchun HTTP_HOST qiymatini qaytaradi, bu mening bir necha yil oldingi PHP 4.x + Apache HTTPD 1.2.x bilan bo'lgan tajribamga zid keladi. , Windows XP da joriy XAMPP (PHP 5.2.8 bilan Apache HTTPD 2.2.1) ni changdan tozaladim, uni ishga tushirdim, ikkala qiymatni ham chop etuvchi PHP sahifasini yaratdim, Xost sarlavhasini o‘zgartirish uchun URLConnection yordamida test Java dasturini yaratdim, va sinovlar menga bu haqiqatan ham (noto'g'ri) holat ekanligini o'rgatdi.

Birinchi marta PHPdan shubhalanib, ba'zilarini qazib olgandan keyin PHP xato hisobotlari Mavzu bo'yicha men muammoning ildizi foydalanilayotgan veb-serverda ekanligini, SERVER_NAME so'ralganda HTTP Host sarlavhasini noto'g'ri qaytarayotganini aniqladim. Shunday qilib, men qazib oldim Apache HTTPD xato hisobotlari foydalanish turli xil kalit so'zlar nisbatan mavzu va men nihoyat tegishli xatoni topdim. Ushbu xatti-harakatlar Apache HTTPD 1.3 dan beri joriy qilingan. Kirishda UseCanonicalName direktivasini o'rnatishingiz kerak httpd.conf da ServerName (hujjatning pastki qismidagi ogohlantirishni ham tekshiring!).

ServerName example.com CanonicalName-dan foydalaning

Bu men uchun ishladi.

Umuman olganda, SERVER_NAME ishonchliroq, lekin siz qaram server konfiguratsiyasida!

HTTP_HOST mijoz tomonidan yuborilgan maqsadli xostdir. Foydalanuvchi foydalanuvchini erkin boshqarishi mumkin. Saytingizga www.stackoverflow.com saytining HTTP_HOST qiymatini so'rab so'rov yuborishning hojati yo'q.

SERVER_NAME VirtualHost server taʼrifidan kelib chiqqan va shuning uchun ishonchliroq hisoblanadi. Bundan tashqari, veb-serverni sozlash bilan bog'liq bo'lgan muayyan sharoitlarda uni tashqaridan boshqarish mumkin. Buni ko'ring Bu SO savol, bu ikkala variantning xavfsizlik jihatlarini ko'rib chiqadi.

Xavfsiz bo'lish uchun unga tayanmasligingiz kerak. Biroq, qaysi birini ishlatish, albatta, nima qilishni xohlayotganingizga bog'liq. Agar siz skriptingiz qaysi domenda ishlayotganini aniqlamoqchi bo'lsangiz, tajovuzkordan kelgan noto'g'ri qiymatlar hech narsani buzmasa, HTTP_HOST-dan xavfsiz foydalanishingiz mumkin.

Esda tutingki, agar siz IPv6 dan foydalanmoqchi bo'lsangiz, SERVER_NAME emas, balki HTTP_HOST dan foydalanishni xohlaysiz. Agar http://[::1]/ ni kiritsangiz, muhit o'zgaruvchilari quyidagicha bo'ladi:

HTTP_HOST = [::1] SERVER_NAME = ::1

Bu, masalan, mod_rewrite-ni qilsangiz, yomon natijalarga erishishingiz mumkinligini anglatadi. SSL qayta yo'naltirish misoli:

# SERVER_NAME ISHLAMAYDI - https://::1/ RewriteRule ga yo'naltirish.* https://%(SERVER_NAME)/ # HTTP_HOST ishlaydi - https://[::1]/ RewriteRule ga qayta yo'naltirish.* https: //%(HTTP_HOST)/

Bu FAQAT serverga xost nomisiz kirayotganingizda amal qiladi.

Agar siz server.php orqali yoki nima bilan qo'ng'iroq qilmoqchi bo'lsangiz, quyidagilarni tekshirmoqchi bo'lsangiz:

Keyin saytingiz uchun barcha haqiqiy URL manzillariga kiring va farqni tekshiring.

Odamlar “SERVER_NAME ishonchliroq” degani nimani anglatishini tushunishim uchun biroz vaqt kerak bo‘ldi. Men umumiy serverdan foydalanmoqdaman va virtual xost ko'rsatmalariga kirish imkonim yo'q. Shunday qilib, men turli kataloglarda turli HTTP_HOSTlarni xaritalash uchun .htaccess da mod_rewrite dan foydalanmoqdaman. Bunday holda, ushbu HTTP_HOST qiymati mantiqiy bo'ladi.

Agar siz nomga asoslangan virtual xostlardan foydalansangiz, vaziyat o'xshash bo'ladi: virtual xost ichidagi ServerName direktivasi sizga ushbu virtual xostga qanday xost nomini ko'rsatishini aytib beradi. Xulosa shuki, har ikkala holatda ham mijoz tomonidan so‘rov vaqtida taqdim etilgan xost nomi (HTTP_HOST) serverdagi nomga mos kelishi kerak, uning o‘zi katalogga ko‘rsatilgan. Xarita virtual xost ko'rsatmalariga yoki htaccess mod_rewrite qoidalariga qarshi amalga oshiriladimi, bu erda ikkinchi darajali. Bunday hollarda HTTP_HOST SERVER_NAME bilan bir xil bo‘ladi. Apache shu tarzda tuzilganidan xursandman.

Biroq, IP-ga asoslangan virtual xostlar uchun vaziyat boshqacha. Bu holatda va faqat shu holatda, SERVER_NAME va HTTP_HOST farq qilishi mumkin, chunki mijoz endi serverni nomi bo'yicha emas, IP bo'yicha tanlaydi. Haqiqatan ham, bu muhim bo'lgan maxsus konfiguratsiyalar bo'lishi mumkin.

Shunday qilib, bundan buyon, agar mening kodim ushbu maxsus konfiguratsiyalarga ko‘chirilsa, men SERVER_NAME xizmatidan foydalanaman.

Sizda oddiy sozlash (CentOS 7, Apache 2.4.x va PHP 5.6.20) va faqat bitta veb-sayt (umumiy xostingni nazarda tutmagan holda) bor deb faraz qilsangiz...

PHP maʼnosida $_SERVER["SERVER_NAME"] httpd.conf da (yoqilgan virtual xost konfiguratsiyasidanmi) Apache konfiguratsiyasiga (**ServerName** direktivasi, UseCanonicalName On bilan) asoslangan holda $_SERVER yuqori sinfida roʻyxatdan oʻtgan PHP elementidir. fayl, har qanday narsa va boshqalar). HTTP_HOST HTTP xost sarlavhasidan olingan. Buni foydalanuvchi kiritishi deb hisoblang. Ishlatishdan oldin filtrlang va tekshiring.

Taqqoslash uchun asos sifatida $_SERVER["SERVER_NAME"] ishlatadigan misol. Quyidagi usul men ServerValidator (Validator bolasi) deb atagan ma'lum bir bolalar sinfida. ServerValidator ulardan foydalanishdan oldin $_SERVER da olti yoki etti elementni tekshiradi.

HTTP so'rovi POST ekanligini aniqlashda men ushbu usuldan foydalanaman.

Umumiy funktsiya isPOST() ( return (($this->requestMethod === "POST") && // Ignore $this->hasTokenTimeLeft() && // Ignore $this->hasSameGETandPOSTIdentities() && // Ingore ($this) ->httpHost === filter_input(INPUT_SERVER, "SERVER_NAME"))));

Ushbu usul chaqirilganda, mos keladigan $_SERVER elementlarini (va tegishli xususiyatlar to'plamlarini) barcha filtrlash va tekshirish amalga oshirilgan bo'ladi.

($this->httpHost === filter_input(INPUT_SERVER, "SERVER_NAME")

$_SERVER["HTTP_HOST"] qiymati (yakunida so'ralgan HTTP xost sarlavhasidan olingan) $_SERVER["SERVER_NAME"] ga mos kelishini tekshiradi.

Endi men misolimni tushuntirish uchun superglobal nutqdan foydalanmoqdaman, lekin bu ba'zi odamlar filter_input_array() ga nisbatan INPUT_GET, INPUT_POST va INPUT_SERVER bilan tanish emasligidir.

Xulosa shuki, men to'rtta shart bajarilmasa, serverimda POST so'rovlarini qayta ishlamayman. Shunday qilib, POST so'rovlari nuqtai nazaridan, qattiq brauzerlar uchun HTTP xost sarlavhasini taqdim etmaslik (mavjudligi avvalroq tekshirilgan) halokat afsunidir. HTTP 1.0. Bundan tashqari, so'ralgan xost qiymatga mos kelishi kerak Server nomi httpd.conf da va kengaytma bo'yicha - $_SERVER supermaklonidagi $_SERVER("SERVER_NAME") qiymati. Shunga qaramay, men INPUT_SERVER dan PHP filtri funksiyalari bilan foydalanardim, lekin siz mening driftimni buzdingiz.

BalusC tomonidan ta'kidlanganidek, SERVER_NAME ishonchli emas va siz va server o'rtasida bo'lishi mumkin bo'lgan apache konfiguratsiyasi, server serveri konfiguratsiyasi va xavfsizlik devorida o'zgartirilishi mumkin.

Quyidagi funksiya har doim portsiz haqiqiy xostni (foydalanuvchi tomonidan kiritilgan xost) qaytaradi va u deyarli ishonchli:

Funktsiya getRealHost())( list($realHost,)=portlash(":",$_SERVER["HTTP_HOST"]); return $realHost; )

baham ko'ring

JavaScript brauzeringizda bloklangan. Iltimos, sayt ishlashi uchun JavaScript-ni yoqing!

Superglobal massiv $_SERVER

Massivga $_SERVER PHP tarjimoni serverdan olingan o'zgaruvchilarni joylashtiradi. Ushbu o'zgaruvchilarsiz veb-ilovalarni to'liq qo'llab-quvvatlashni tashkil qilish qiyin. Quyida superglobal massivning eng muhim elementlarining tavsifi keltirilgan $_SERVER.

Izoh

  • $_SERVER massiv elementlarining toʻliq roʻyxatini koʻring
  • Siz yo massiv dumpini chop etuvchi print_r() funksiyasidan yoki PHP tarjimoni haqidagi ma’lumotlarni aks ettiruvchi phpinfo() funksiyasidan foydalanishingiz mumkin.

    Massiv ( => bo'yicha => 200 => => htmlweb.ru => https => 443 => yopish => Mozilla/5.0 (mos; Googlebot/2.1; +http://www.google.com/bot. html) => */* => beget=begetok => gzip,deflate => /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin = > => Apache/2.4.25 (Debian) mpm-itk/2.4.7-04 OpenSSL/1.0.2l => htmlweb.ru => 185.12.92.137 => 80 => 144.76.78.4 => /var/www/ htmlweb/data/www/htmlweb.ru => http => => /var/www/htmlweb/data/www/htmlweb.ru => [elektron pochta himoyalangan]=>.php => 35242 => /php/function/$_server.php => CGI/1.1 => HTTP/1.0 => GET => => /php/function/%24_server.php => /index.php => /index.php => 1560059525.711 => 1560059525) 1

    $_SERVER[" DOCUMENT_ROOT"]

    $_SERVER["DOCUMENT_ROOT"] elementi serverning asosiy katalogiga yo'lni o'z ichiga oladi, agar skript virtual xostda bajarilgan bo'lsa, bu element virtual xostning asosiy katalogiga yo'lni belgilaydi. Bular. httpd.conf konfiguratsiya faylida virtual xost "D:/main" ga o'rnatilgan DocumentRoot direktivasiga ega, $_SERVER["DOCUMENT_ROOT"] elementi "D:main" qiymatini o'z ichiga oladi.

    $_SERVER[" REMOTE_ADDR"]

    $_SERVER["REMOTE_ADDR"] elementi mijozning IP manzilini o'z ichiga oladi. Mahalliy mashinada sinovdan o'tkazishda bu manzil 127.0.0.1 ga teng bo'ladi. Biroq, tarmoqda sinovdan o'tkazilayotganda, o'zgaruvchi mijozning IP manzilini yoki mijoz serverga yetib borgan oxirgi proksi-serverni qaytaradi. Agar mijoz proksi-serverdan foydalansa, uning IP manzilini HTTP_X_FORWARDED_FOR muhit o'zgaruvchisi yordamida bilib olishingiz mumkin, uning qiymati getenv() funksiyasi yordamida olinishi mumkin.

    Izoh

    Proksi-serverlar - bu maxsus xizmat turini ta'minlovchi maxsus oraliq serverlar: trafikni siqish, ma'lumotlarni kodlash, mobil qurilmalar uchun moslashish va boshqalar. Ko'pgina proksi-serverlar orasida mijozning haqiqiy IP-manzilini yashirish imkonini beruvchi anonim proksi-serverlar mavjud; bunday serverlar HTTP_X_FORWARDED_FOR muhit o'zgaruvchisini qaytarmaydi;

    Atrof-muhit o'zgaruvchisini olish HTTP_X_FORWARDED_FOR

    echo @getenv(HTTP_X_FORWARDED_FOR);

    $_SERVER[" SCRIPT_FILENAME"]

    $_SERVER["SCRIPT_FILENAME"] elementi disk ildizidan faylga mutlaq yo'lni o'z ichiga oladi. Shunday qilib, agar server Windows operatsion tizimida ishlayotgan bo'lsa, unda bu yo'l shunday ko'rinishi mumkin: "d:main estindex.php", ya'ni. yo'l UNIX-ga o'xshash operatsion tizimda diskdan ko'rsatilgan, yo'l ildiz katalogidan ko'rsatilgan /, masalan, "/var/share/www/test/index.php".

    /var/www/htmlweb/data/www/site/index.php

    $_SERVER[" SERVER_NAME"]

    $_SERVER["SERVER_NAME"] elementi odatda unda joylashgan saytning domen nomiga mos keladigan server nomini o'z ichiga oladi. Masalan,

    $_SERVER["SERVER_NAME"] elementining mazmuni ko'pincha $_SERVER["HTTP_HOST"] elementining mazmuni bilan bir xil bo'ladi. Server nomidan tashqari, superglobal $_SERVER massivi bir qator server parametrlarini, masalan, server IP-manzilini, tinglash portini, qaysi veb-server o'rnatilganligini va HTTP protokoli versiyasini aniqlash imkonini beradi. Ushbu ma'lumotlar mos ravishda $_SERVER["SERVER_ADDR"], $_SERVER["SERVER_PORT"], $_SERVER["SERVER_SOFTWARE"] va $_SERVER["SERVER_PROTOCOL"] elementlariga joylashtirilgan. Quyida ushbu elementlardan foydalanish misoli keltirilgan.

    $_SERVER massiv elementlaridan foydalanish

    echo "Server nomi ".$_SERVER["SERVER_NAME"]."
    "; echo "Server IP manzili ".$_SERVER["SERVER_ADDR"]."
    "; echo "Server porti - ".$_SERVER["SERVER_PORT"]."
    "; echo "Veb server - ".$_SERVER["SERVER_SOFTWARE"]."
    "; echo "HTTP protokoli versiyasi - ".$_SERVER["SERVER_PROTOCOL"]."
    ";

    Server nomi - veb-sayt
    Server IP manzili - 185.12.92.137
    Server porti - 80
    Veb-server - Apache/2.4.25 (Debian) mpm-itk/2.4.7-04 OpenSSL/1.0.2l
    HTTP protokoli versiyasi - HTTP/1.0

    $_SERVER[" REQUEST_METHOD"]

    $_SERVER["REQUEST_METHOD"] elementi skriptni chaqirish uchun ishlatiladigan so'rov usulini o'z ichiga oladi: GET yoki POST.

    Echo $_SERVER["REQUEST_METHOD"];

    $_SERVER[" QUERY_STRING"]

    $_SERVER["QUERY_STRING"] elementi, agar so'rovlar qatori manzil bo'lsa, skriptga uzatiladigan parametrlarni o'z ichiga oladi.

    Masalan, kirishda:
    $_SERVER["QUERY_STRING"] elementi "?" belgisidan keyingi barcha matnni o'z ichiga oladi:

    Echo $_SERVER["QUERY_STRING"];

    id=1&test=wet&id_theme=512

    $_SERVER[" PHP_SELF"]

    $_SERVER["PHP_SELF"] elementi virtual xostning asosiy katalogidan boshlab skript nomini o'z ichiga oladi, ya'ni. agar so'rovlar qatori manzil bo'lsa http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 keyin $_SERVER["PHP_SELF"] elementi fragmentni o'z ichiga oladi "/test/index.php". Odatda, xuddi shu fragment $_SERVER["SCRIPT_NAME"] elementiga joylashtiriladi.

    $_SERVER[" REQUEST_URI"]

    $_SERVER["REQUEST_URI"] elementi virtual xost va parametrlarning ildiz katalogidan boshlab skript nomini o'z ichiga oladi, ya'ni. agar so'rovlar qatori manzil bo'lsa: http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 keyin $_SERVER["REQUEST_URI"] elementi fragmentni o'z ichiga oladi "/test/index.php?id=1&test=wet&id_theme=512". So'rovlar qatoriga joylashtirilgan skriptdagi to'liq manzilni tiklash uchun quyida keltirilgan $_SERVER massivining elementlari kombinatsiyasidan foydalanish kifoya.

    Skriptning to'liq manzili

    echo "http://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];