JavaScript on teie brauseris blokeeritud. Saidi toimimiseks lubage JavaScript!
Superglobaalne massiiv $_SERVER
Massiiviks $_SERVER PHP-tõlk paigutab serverist saadud muutujad. Ilma nende muutujateta on veebirakenduste täielikku tuge raske korraldada. Allpool on superglobaalse massiivi olulisemate elementide kirjeldus $_SERVER.
Kommenteeri
Massiiv ( => sisse => 200 => sisse => htmlweb.ru => https => 443 => sulge => Mozilla/5.0 (ühildub; 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 => [e-postiga kaitstud]=>.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"]
Element $_SERVER["DOCUMENT_ROOT"] sisaldab serveri juurkataloogi teed, kui skript käivitatakse virtuaalses hostis, määrab see element tee virtuaalse hosti juurkataloogi. Need. konfiguratsioonifailis httpd.conf on virtuaalsel hostil DocumentRoot direktiiv seatud väärtusele "D:/main", element $_SERVER["DOCUMENT_ROOT"] sisaldab väärtust "D:main".
$_SERVER[" REMOTE_ADDR"]
Element $_SERVER["REMOTE_ADDR"] sisaldab kliendi IP-aadressi. Kohalikus masinas testimisel on see aadress 127.0.0.1. Võrgus testides tagastab muutuja aga kliendi IP-aadressi või viimase puhverserveri, mille kaudu klient serverisse jõudis. Kui klient kasutab puhverserverit, saate selle IP-aadressi teada keskkonnamuutuja HTTP_X_FORWARDED_FOR abil, mille väärtuse saab hankida funktsiooni getenv() abil.
Kommenteeri
Puhverserverid on spetsiaalsed vaheserverid, mis pakuvad spetsiaalset tüüpi teenust: liikluse tihendamine, andmete kodeerimine, kohandamine mobiilseadmete jaoks jne. Paljude puhverserverite hulgas on nn anonüümsed puhverserverid, mis võimaldavad varjata kliendi tegelikku IP-aadressi, sellised serverid ei tagasta HTTP_X_FORWARDED_FOR keskkonnamuutujat.
Keskkonnamuutuja toomine HTTP_X_FORWARDED_FOR
kaja @getenv(HTTP_X_FORWARDED_FOR);
$_SERVER[" SCRIPT_FILENAME"]
Element $_SERVER["SCRIPT_FILENAME"] sisaldab kettajuurest faili absoluutset teed. Seega, kui serveris töötab Windowsi operatsioonisüsteem, võib see tee välja näha järgmine: “d:main estindex.php”, st. tee on määratud kettalt UNIX-i sarnases operatsioonisüsteemis, tee määratakse juurkataloogist /, näiteks "/var/share/www/test/index.php".
/var/www/htmlweb/data/www/site/index.php
$_SERVER[" SERVER_NAME"]
Element $_SERVER["SERVER_NAME"] sisaldab serveri nime, mis tavaliselt ühtib sellel asuva saidi domeeninimega. Näiteks,
Elemendi $_SERVER["SERVER_NAME"] sisu on sageli sama, mis elemendi $_SERVER["HTTP_HOST"] sisu. Lisaks serveri nimele võimaldab superglobaalne massiiv $_SERVER teada saada mitmeid serveri parameetreid, näiteks serveri IP-aadressi, kuulamispordi, milline veebiserver on installitud ja HTTP-protokolli versiooni. See teave paigutatakse vastavalt elementidesse $_SERVER["SERVER_ADDR"], $_SERVER["SERVER_PORT"], $_SERVER["SERVER_SOFTWARE"] ja $_SERVER["SERVER_PROTOCOL"]. Allpool on näide nende elementide kasutamisest.
Massiivi $_SERVER elementide kasutamine
echo "Serveri nimi on ".$_SERVER["SERVER_NAME"].""; echo "Serveri IP-aadress on ".$_SERVER["SERVER_ADDR"]."
"; echo "Serveri port - ".$_SERVER["SERVER_PORT"]."
"; echo "Veebiserver - ".$_SERVER["SERVER_TARKVARA"]."
"; echo "HTTP-protokolli versioon - ".$_SERVER["SERVER_PROTOCOL"]."
";
Serveri nimi – sait
Serveri IP-aadress - 185.12.92.137
Serveri port - 80
Veebiserver – Apache/2.4.25 (Debian) mpm-itk/2.4.7-04 OpenSSL/1.0.2l
HTTP-protokolli versioon – HTTP/1.0
$_SERVER[" REQUEST_METHOD"]
Element $_SERVER["REQUEST_METHOD"] sisaldab päringumeetodit, mida kasutatakse skripti kutsumiseks: GET või POST.
Echo $_SERVER["REQUEST_METHOD"];
$_SERVER[" QUERY_STRING"]
Element $_SERVER["QUERY_STRING"] sisaldab skriptile edastatud parameetreid, kui päringustring on aadress
Näiteks juurdepääsul:
element $_SERVER["QUERY_STRING"] sisaldab kogu teksti pärast märki "?"
Kaja $_SERVER["QUERY_STRING"];
id=1&test=wet&id_theme=512
$_SERVER[" PHP_ISE"]
Element $_SERVER["PHP_SELF"] sisaldab skripti nime, alustades virtuaalse hosti juurkataloogist, st. kui päringustring on aadress http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 siis element $_SERVER["PHP_SELF"] sisaldab fragmenti "/test/index.php". Tavaliselt paigutatakse sama fragment $_SERVER["SCRIPT_NAME"] elemendisse.
$_SERVER[" REQUEST_URI"]
Element $_SERVER["REQUEST_URI"] sisaldab skripti nime, alustades virtuaalse hosti juurkataloogist ja parameetritest, st. kui päringustring on aadress: http://www.mysite.ru/test/index.php?id=1&test=wet&id_theme=512 siis element $_SERVER["REQUEST_URI"] sisaldab fragmenti "/test/index.php?id=1&test=wet&id_theme=512". Päringureale paigutatud skripti täieliku aadressi taastamiseks piisab, kui kasutada allpool toodud massiivi $_SERVER elementide kombinatsiooni
Täielik aadress skriptile
echo "http://".$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];Ja see on see, mida klient tegelikult kasutas päringu "sihthostjana". SERVER_NAME on serveri konfiguratsioonis määratletud. Milline neist sõltub sellest, milleks seda vajate. Nüüd peaksite mõistma, et see on kliendi juhitav väärtus, mis pole seega äriloogikas kasutamiseks usaldusväärne, ja teine on serveri kontrollitav väärtus, mis on usaldusväärsem. Peate siiski tagama, et veebiserveril oleks õige SERVER_NAME konfiguratsioon. Võttes näiteks Apache HTTPD, on siin väljavõte selle dokumentatsioonist:
Kui ServerName pole määratud, proovib server IP-aadressi pöördotsingu abil hostinime järeldada. Kui jaotises ServerName pole porti määratud, kasutab server sissetuleva päringu porti. Optimaalse töökindluse ja prognoositavuse tagamiseks peaksite serverinime direktiivi abil määrama selge hostinime ja pordi.
Värskenda: Pärast Pekka vastuse kontrollimist teie küsimusele, mis sisaldab linki bobince'i vastusele, tagastab PHP alati SERVER_NAME väärtuse HTTP_HOST, mis on vastuolus minu enda paari aasta taguse kogemusega PHP 4.x + Apache HTTPD 1.2.x , puhusin tolmu maha oma praeguselt XAMPP-lt Windows XP-s (Apache HTTPD 2.2.1 koos PHP 5.2.8-ga), käivitasin selle, lõin PHP lehe, mis prindib mõlemad väärtused, lõin Java testrakenduse URLConnectioni abil hosti päise muutmiseks, ja testid õpetasid mulle, et see on tõepoolest (valesti) nii.
Pärast esmalt PHP kahtlustamist ja mõnesse süvenemist PHP veaaruanded teemaga seoses sain teada, et probleemi juur on kasutatavas veebiserveris, et see tagastas valesti HTTP hosti päise, kui SERVER_NAME taotleti. Nii et ma süvenesin Apache HTTPD veaaruanded kasutades erinevaid märksõnu suhteliselt teema ja lõpuks leidsin sellega seotud vea. Seda käitumist tutvustati alates Apache HTTPD 1.3 versioonist. Peate kirjes sisse lülitama käsu UseCanonicalName
See töötas minu jaoks.
Üldiselt on SERVER_NAME usaldusväärsem, kuid teie sõltuv serveri konfiguratsioonis!
HTTP_HOST on kliendi saadetud sihthost. Kasutaja saab kasutajaga vabalt manipuleerida. Pole vaja saata oma saidile päringut, milles küsitakse www.stackoverflow.com HTTP_HOST väärtust.
SERVER_NAME pärineb VirtualHosti serveri definitsioonist ja seetõttu peetakse seda usaldusväärsemaks. Seda saab ka väliselt manipuleerida teatud tingimustel, mis on seotud teie veebiserveri seadistusega. Vaata seda See NII küsimus, mis käsitleb mõlema valiku turvaaspekte.
Ohutuse tagamiseks ei tohiks sellele loota. Kuid mida kasutada, sõltub tegelikult sellest, mida soovite teha. Kui soovite määrata, millises domeenis teie skript töötab, võite turvaliselt kasutada HTTP_HOST-i, kuni ründajalt pärinevad kehtetud väärtused ei saa midagi rikkuda.
Pange tähele, et kui soovite kasutada IPv6, siis tõenäoliselt soovite kasutada HTTP_HOSTi, mitte SERVER_NAME. Kui sisestate http://[::1]/ , on keskkonnamuutujad järgmised:
HTTP_HOST = [::1] SERVER_NAME = ::1
See tähendab, et kui teete näiteks mod_rewrite, võite saada ebameeldivaid tulemusi. SSL-i ümbersuunamise näide:
# SERVER_NAME EI tööta – ümbersuunamine aadressile https://::1/ RewriteRule .* https://%(SERVER_NAME)/ # HTTP_HOST töötab – ümbersuunamine aadressile https://[::1]/ RewriteRule .* https: //%(HTTP_HOST)/
See kehtib AINULT siis, kui sisenete serverisse ilma hostinimeta.
kui soovite kontrollida server.php kaudu või mis iganes soovite helistada, kasutades järgmist:
Seejärel avage kõik oma saidi kehtivad URL-id ja testige erinevust.
Mul kulus veidi aega, enne kui sain aru, mida inimesed mõtlevad sõnadega "SERVER_NAME on usaldusväärsem". Kasutan jagatud serverit ja mul pole juurdepääsu virtuaalse hosti direktiividele. Seega kasutan faili mod_rewrite failis .htaccess, et kaardistada erinevates kataloogides erinevaid HTTP_HOST-e. Sel juhul on see HTTP_HOST väärtus mõistlik.
Sarnane on olukord, kui kasutate nimepõhiseid virtuaalhoste: virtuaalses hostis olev ServerName direktiiv ütleb teile lihtsalt, milline hostinimi selle virtuaalse hostiga vastendatakse. Põhimõte on see, et mõlemal juhul peab kliendi poolt päringu ajal antud hostinimi (HTTP_HOST) ühtima serveris oleva nimega, mis on ise kataloogiga seotud. See, kas vastendamine toimub virtuaalse hosti direktiivide või htaccess mod_rewrite reeglite alusel, on siin teisejärguline. Nendel juhtudel on HTTP_HOST sama, mis SERVER_NAME. Mul on hea meel, et Apache on nii konfigureeritud.
IP-põhiste virtuaalsete hostide puhul on olukord aga erinev. Sel juhul ja ainult sel juhul võivad SERVER_NAME ja HTTP_HOST erineda, kuna klient valib serveri nüüd IP, mitte nime järgi. Tõepoolest, seal võib olla erikonfiguratsioone, kus see on oluline.
Nüüdsest kasutan ma serverit SERVER_NAME juhuks, kui mu kood porditakse nendesse erikonfiguratsioonidesse.
Eeldusel, et teil on lihtne seadistus (CentOS 7, Apache 2.4.x ja PHP 5.6.20) ja ainult üks veebisait (ei eelda jagatud hostimist)...
PHP mõistes on $_SERVER["SERVER_NAME"] PHP element, mis on registreeritud ülemklassis $_SERVER, mis põhineb teie Apache konfiguratsioonil (**ServerName** direktiiv koos UseCanonicalName On) failis httpd.conf (kas siis lubatud virtuaalse hosti konfiguratsioonist fail, midagi jne). HTTP_HOST tuletatud HTTP hosti päisest. Võtke seda kasutaja sisendiks. Enne kasutamist filtreerige ja kontrollige.
Siin on näide, kus ma kasutan võrdlusalusena $_SERVER["SERVER_NAME"]. Järgmine meetod on konkreetsel alamklassil, mida ma nimetasin ServerValidatoriks (Validatori laps). ServerValidator kontrollib enne nende kasutamist kuus või seitse elementi $_SERVERis.
Kui otsustan, kas HTTP-päring on POST, kasutan seda meetodit.
Avalik funktsioon isPOST() ( return (($this->requestMethod === "POST") && // Ignoreeri $this->hasTokenTimeLeft() && // Ignoreeri $this->hasSameGETandPOSTIdentities() && // Ingore ($this ->httpHost === filter_input(INPUT_SERVER, "SERVER_NAME")));
Selle meetodi väljakutsumise ajaks on kõik vastavate $_SERVER elementide (ja vastavate atribuutide komplektide) filtreerimine ja valideerimine tehtud.
($this->httpHost === filter_input(INPUT_SERVER, "SERVER_NAME")
Kinnitab, et $_SERVER["HTTP_HOST"] väärtus (lõpuks saadi taotletud HTTP hosti päisest) ühtib $_SERVER["SERVER_NAME"] .
Nüüd kasutan oma näite selgitamiseks superglobaalset kõnet, kuid selle põhjuseks on asjaolu, et mõned inimesed ei ole filtri_input_array() suhtes INPUT_GET , INPUT_POST ja INPUT_SERVER tuttavad.
Lõpptulemus on see, et ma ei töötle oma serveris POST-i päringuid, kui kõik neli tingimust pole täidetud. Seega, mis puudutab POST-i päringuid, siis HTTP hosti päise suutmatus (olemasolu kontrollitud varem) rangete brauserite jaoks. HTTP 1.0. Lisaks peab taotletud host vastama väärtusele ServeriNimi failis httpd.conf ja laienduse järgi - väärtus $_SERVER("SERVER_NAME") supermaklonis $_SERVER. Jällegi, ma kasutaksin PHP-filtri funktsioonidega INPUT_SERVER, kuid te rikkusite mu triivi.
Nagu balusC väitis, ei ole SERVER_NAME usaldusväärne ja seda saab muuta teie ja serveri vahelises apache konfiguratsioonis, serveriserveri konfiguratsioonis ja tulemüüris.
Järgmine funktsioon tagastab alati tõelise hosti (kohandatud tüüpi hosti) ilma pordita ja see on peaaegu lollikindel:
Funktsioon getRealHost())( list($realHost,)=explode(":",$_SERVER["HTTP_HOST"]); tagasta $realHost; )
jagadaEsiteks täiustame registreerimislehte, lisades avatari üleslaadimise võimaluse. Lähtepilt peab olema jpg-, gif- või png-vormingus. Samuti ei tohiks see olla suurem kui 2 MB. Ärge muretsege, pärast skripti poolt selle tihendamist on avatari suurus umbes 3 kb ja jpg-vormingus. Avage leht reg.php ja lisage see sildile < vormi> rida enctype="multipart/form-data", nagu näites: