Zahteva HTTP
Nette inkapsulira HTTP zahtevo v objekte z razumljivim API-jem in hkrati zagotavlja sanacijski filter.
HTTP zahtevo predstavlja objekt Nette\Http\Request. Če
delate z Nette, ta objekt samodejno ustvari ogrodje in si ga lahko pustite predati s pomočjo dependency injection. V presenterjih je dovolj le
poklicati metodo $this->getHttpRequest()
. Če delate izven Nette Frameworka, si lahko ustvarite objekt s pomočjo
RequestFactory.
Velika prednost Nette je, da pri ustvarjanju objekta samodejno očisti vse vhodne parametre GET, POST, COOKIE in tudi URL kontrolnih znakov in neveljavnih UTF-8 sekvenc. S temi podatki lahko nato varno nadalje delate. Očiščeni podatki se nato uporabljajo v presenterjih in obrazcih.
Nette\Http\Request
Ta objekt je nespremenljiv (immutable). Nima nobenih setterjev, ima le en t.i. wither withUrl()
, ki objekta ne
spreminja, ampak vrača novo instanco s spremenjeno vrednostjo.
withUrl (Nette\Http\UrlScript $url): Nette\Http\Request
Vrača klon z drugim URL-jem.
getUrl(): Nette\Http\UrlScript
Vrača URL zahteve kot objekt UrlScript.
$url = $httpRequest->getUrl();
echo $url; // https://doc.nette.org/cs/?action=edit
echo $url->getHost(); // nette.org
Opozorilo: brskalniki ne pošiljajo fragmenta na strežnik, zato bo $url->getFragment()
vračal
prazen niz.
getQuery (?string $key=null): string|array|null
Vrača parametre GET zahteve.
$all = $httpRequest->getQuery(); // vrača polje vseh parametrov iz URL-ja
$id = $httpRequest->getQuery('id'); // vrača GET parameter 'id' (ali null)
getPost (?string $key=null): string|array|null
Vrača parametre POST zahteve.
$all = $httpRequest->getPost(); // vrača polje vseh parametrov iz POST-a
$id = $httpRequest->getPost('id'); // vrača POST parameter 'id' (ali null)
getFile (string|string[] $key): Nette\Http\FileUpload|array|null
Vrača naloženo datoteko kot objekt Nette\Http\FileUpload:
$file = $httpRequest->getFile('avatar');
if ($file?->hasFile()) { // je bila kakšna datoteka naložena?
$file->getUntrustedName(); // ime datoteke, ki ga je poslal uporabnik
$file->getSanitizedName(); // ime brez nevarnih znakov
}
Za dostop do ugnezdene strukture navedite polje ključev.
//<input type="file" name="my-form[details][avatar]" multiple>
$file = $request->getFile(['my-form', 'details', 'avatar']);
Ker ni mogoče zaupati podatkom od zunaj in se torej tudi ne zanašati na obliko strukture datotek, je ta način varnejši kot
na primer $request->getFiles()['my-form']['details']['avatar']
, ki lahko odpove.
getFiles(): array
Vrne drevo vseh naloženih datotek v normalizirani strukturi, katere listi so objekti Nette\Http\FileUpload:
$files = $httpRequest->getFiles();
getCookie (string $key): string|array|null
Vrača piškotek ali null
, če ne obstaja.
$sessId = $httpRequest->getCookie('sess_id');
getCookies(): array
Vrača vse piškotke.
$cookies = $httpRequest->getCookies();
getMethod(): string
Vrača HTTP metodo, s katero je bila narejena zahteva.
$httpRequest->getMethod(); // GET, POST, HEAD, PUT
isMethod (string $method): bool
Testira HTTP metodo, s katero je bila narejena zahteva. Parameter je neobčutljiv na velikost črk.
if ($httpRequest->isMethod('GET')) // ...
getHeader (string $header): ?string
Vrača HTTP glavo ali null
, če ne obstaja. Parameter je neobčutljiv na velikost črk.
$userAgent = $httpRequest->getHeader('User-Agent');
getHeaders(): array
Vrača vse HTTP glave kot asociativno polje.
$headers = $httpRequest->getHeaders();
echo $headers['Content-Type'];
isSecured(): bool
Je povezava šifrirana (HTTPS)? Za pravilno delovanje je morda treba nastaviti proxy.
isSameSite(): bool
Ali zahteva prihaja iz iste (pod)domene in je sprožena s klikom na povezavo? Nette za zaznavanje uporablja piškotek
_nss
(prej nette-samesite
).
isAjax(): bool
Gre za AJAX zahtevo?
getRemoteAddress(): ?string
Vrača IP naslov uporabnika. Za pravilno delovanje je morda treba nastaviti proxy.
getRemoteHost(): ?string
Vrača DNS prevod IP naslova uporabnika. Za pravilno delovanje je morda treba nastaviti proxy.
getBasicCredentials(): ?array
Vrača podatke za preverjanje pristnosti za Basic HTTP authentication.
[$user, $password] = $httpRequest->getBasicCredentials();
getRawBody(): ?string
Vrača telo HTTP zahteve.
$body = $httpRequest->getRawBody();
detectLanguage (array $langs): ?string
Zazna jezik. Kot parameter $lang
predamo polje z jeziki, ki jih aplikacija podpira, in ona vrne tistega, ki bi ga
brskalnik obiskovalca najraje videl. To niso nobene čarovnije, le uporablja se glava Accept-Language
. Če ne pride
do nobenega ujemanja, vrača null
.
// brskalnik pošilja npr. Accept-Language: cs,en-us;q=0.8,en;q=0.5,sl;q=0.3
$langs = ['hu', 'pl', 'en']; // jeziki, ki jih podpira aplikacija
echo $httpRequest->detectLanguage($langs); // en
RequestFactory
Razred Nette\Http\RequestFactory služi za
ustvarjanje instance Nette\Http\Request
, ki predstavlja trenutno HTTP zahtevo. (Če delate z Nette, objekt HTTP
zahteve samodejno ustvari ogrodje.)
$factory = new Nette\Http\RequestFactory;
$httpRequest = $factory->fromGlobals();
Metoda fromGlobals()
ustvari objekt zahteve na podlagi trenutnih globalnih spremenljivk PHP ($_GET
,
$_POST
, $_COOKIE
, $_FILES
in $_SERVER
). Pri ustvarjanju objekta samodejno
očisti vse vhodne parametre GET, POST, COOKIE in tudi URL kontrolnih znakov in neveljavnih UTF-8 sekvenc, kar zagotavlja varnost
pri nadaljnjem delu s temi podatki.
RequestFactory lahko pred klicem fromGlobals()
konfigurirate:
- z metodo
$factory->setBinary()
izklopite samodejno čiščenje vhodnih parametrov kontrolnih znakov in neveljavnih UTF-8 sekvenc. - z metodo
$factory->setProxy(...)
navedete IP naslov proxy strežniku, kar je nujno za pravilno zaznavanje IP naslova uporabnika.
RequestFactory omogoča definiranje filtrov, ki samodejno transformirajo dele URL zahteve. Ti filtri odstranjujejo nezaželene znake iz URL-ja, ki so tja lahko vstavljeni na primer z nepravilno implementacijo sistemov za komentarje na različnih spletnih mestih:
// odstranitev presledkov iz poti
$requestFactory->urlFilters['path']['%20'] = '';
// odstranitev pike, vejice ali desnega oklepaja s konca URI
$requestFactory->urlFilters['url']['[.,)]$'] = '';
// čiščenje poti od podvojenih poševnic (privzeti filter)
$requestFactory->urlFilters['path']['/{2,}'] = '/';
Prvi ključ 'path'
ali 'url'
določa, na kateri del URL-ja se filter uporabi. Drugi ključ je
regularni izraz, ki se najde, in vrednost je nadomestilo, ki se uporabi namesto najdenega besedila.
Naložene datoteke
Metoda Nette\Http\Request::getFiles()
vrača polje vseh naloženih datotek v normalizirani strukturi, katere
listi so objekti Nette\Http\FileUpload. Ti
inkapsulirajo podatke, poslane z elementom obrazca <input type=file>
.
Struktura odraža poimenovanje elementov v HTML. V najpreprostejšem primeru je to lahko en sam poimenovan element obrazca, poslan kot:
<input type="file" name="avatar">
V tem primeru $request->getFiles()
vrača polje:
[
'avatar' => /* FileUpload instance */
]
Objekt FileUpload
se ustvari tudi v primeru, da uporabnik ni poslal nobene datoteke ali je pošiljanje
spodletelo. Ali je bila datoteka poslana, vrača metoda hasFile()
:
$request->getFile('avatar')?->hasFile();
V primeru imena elementa, ki uporablja notacijo za polja:
<input type="file" name="my-form[details][avatar]">
izgleda vrnjeno drevo takole:
[
'my-form' => [
'details' => [
'avatar' => /* FileUpload instance */
],
],
]
Lahko ustvarite tudi polje datotek:
<input type="file" name="my-form[details][avatars][]" multiple>
V takem primeru izgleda struktura takole:
[
'my-form' => [
'details' => [
'avatars' => [
0 => /* FileUpload instance */,
1 => /* FileUpload instance */,
2 => /* FileUpload instance */,
],
],
],
]
Dostop do indeksa 1 ugnezdenega polja je najbolje izvesti tako:
$file = $request->getFile(['my-form', 'details', 'avatars', 1]);
if ($file instanceof FileUpload) {
// ...
}
Ker ni mogoče zaupati podatkom od zunaj in se torej tudi ne zanašati na obliko strukture datotek, je ta način varnejši kot
na primer $request->getFiles()['my-form']['details']['avatars'][1]
, ki lahko odpove.
Pregled metod FileUpload
hasFile(): bool
Vrača true
, če je uporabnik naložil kakšno datoteko.
isOk(): bool
Vrača true
, če je bila datoteka uspešno naložena.
getError(): int
Vrača kodo napake pri nalaganju datoteke. Gre za eno od konstant UPLOAD_ERR_XXX. V primeru, da je nalaganje potekalo v redu,
vrača UPLOAD_ERR_OK
.
move (string $dest)
Premakne naloženo datoteko na novo lokacijo. Če ciljna datoteka že obstaja, bo prepisana.
$file->move('/path/to/files/name.ext');
getContents(): ?string
Vrača vsebino naložene datoteke. V primeru, da nalaganje ni bilo uspešno, vrača null
.
getContentType(): ?string
Zazna MIME content type naložene datoteke na podlagi njene signature. V primeru, da nalaganje ni bilo uspešno ali zaznavanje
ni uspelo, vrača null
.
Zahteva PHP razširitev fileinfo
.
getUntrustedName(): string
Vrača originalno ime datoteke, kot ga je poslal brskalnik.
Ne zaupajte vrednosti, ki jo vrne ta metoda. Odjemalec je lahko poslal škodljivo ime datoteke z namenom poškodovati ali vdreti v vašo aplikacijo.
getSanitizedName(): string
Vrača sanirano ime datoteke. Vsebuje samo ASCII znake [a-zA-Z0-9.-]
. Če ime takih znakov ne vsebuje, vrne
'unknown'
. Če je datoteka slika v formatu JPEG, PNG, GIF, WebP ali AVIF, vrne tudi pravilno končnico.
Zahteva PHP razširitev fileinfo
.
getSuggestedExtension(): ?string
Vrača primerno končnico datoteke (brez pike), ki ustreza zaznanemu MIME tipu.
Zahteva PHP razširitev fileinfo
.
getUntrustedFullPath(): string
Vrača originalno pot do datoteke, kot jo je poslal brskalnik pri nalaganju mape. Celotna pot je na voljo samo v PHP 8.1 in višjih. V prejšnjih različicah ta metoda vrača originalno ime datoteke.
Ne zaupajte vrednosti, ki jo vrne ta metoda. Odjemalec je lahko poslal škodljivo ime datoteke z namenom poškodovati ali vdreti v vašo aplikacijo.
getSize(): int
Vrača velikost naložene datoteke. V primeru, da nalaganje ni bilo uspešno, vrača 0
.
getTemporaryFile(): string
Vrača pot do začasne lokacije naložene datoteke. V primeru, da nalaganje ni bilo uspešno, vrača ''
.
isImage(): bool
Vrača true
, če je naložena datoteka slika v formatu JPEG, PNG, GIF, WebP ali AVIF. Zaznavanje poteka na
podlagi njene signature in se ne preverja integriteta celotne datoteke. Ali slika ni poškodovana, lahko ugotovite na primer
s poskusom njenega nalaganjem.
Zahteva PHP razširitev fileinfo
.
getImageSize(): ?array
Vrača par [širina, višina]
z dimenzijami naložene slike. V primeru, da nalaganje ni bilo uspešno ali ne gre
za veljavno sliko, vrača null
.
toImage(): Nette\Utils\Image
Naloži sliko kot objekt Image. V primeru, da nalaganje ni bilo uspešno
ali ne gre za veljavno sliko, vrže izjemo Nette\Utils\ImageException
.