HTTP kérés

A Nette a HTTP-kérést érthető API-val rendelkező objektumokba kapszulázza, miközben szanálási szűrőt biztosít.

A HTTP-kérés egy Nette\Http\Request objektum, amelyet függőségi injektálással átadva kapunk meg. Az előadókban egyszerűen hívja meg a $httpRequest = $this->getHttpRequest().

Ami fontos, hogy a Nette ennek az objektumnak a létrehozásakor megtisztítja az összes GET, POST és COOKIE bemeneti paramétert, valamint az URL-eket a vezérlő karakterektől és az érvénytelen UTF-8 szekvenciáktól. Így nyugodtan folytathatja a munkát az adatokkal. A megtisztított adatok ezután a prezenterekben és űrlapokban használhatók.

Telepítés és követelmények

Nette\Http\Request

Ez az objektum megváltoztathatatlan. Nincsenek setterei, csak egy úgynevezett wither withUrl(), amely nem változtatja meg az objektumot, hanem egy új példányt ad vissza a módosított értékkel.

withUrl(Nette\Http\UrlScript $url): Nette\Http\Request

Egy klónt ad vissza egy másik URL-címmel.

getUrl(): Nette\Http\UrlScript

Visszaadja a kérés URL-címét UrlScript objektumként.

$url = $httpRequest->getUrl();
echo $url; // https://nette.org/en/documentation?action=edit
echo $url->getHost(); // nette.org

A böngészők nem küldenek töredéket a kiszolgálónak, ezért a $url->getFragment() üres karakterláncot ad vissza.

getQuery(string $key=null): string|array|null

Visszaadja a GET-kérelem paramétereit:

$all = $httpRequest->getQuery(); // az összes URL paraméter tömbje
$id = $httpRequest->getQuery('id'); // visszaadja a GET paramétert 'id' (vagy null)

getPost(string $key=null): string|array|null

POST kérés paramétereinek visszaadása:

$all = $httpRequest->getPost(); // az összes POST paraméter tömbje
$id = $httpRequest->getPost('id'); // visszaadja az 'id' POST paramétert (vagy null)

getFile(string|string[] $key): Nette\Http\FileUpload|array|null

Visszaadja a feltöltést objektumként: Nette\Http\FileUpload:

$file = $httpRequest->getFile('avatar');
if ($file->hasFile()) { // feltöltöttünk bármilyen fájlt?
	$file->getUntrustedName(); // a felhasználó által küldött fájl neve
	$file->getSanitizedName(); // a veszélyes karakterek nélküli név
}

Adja meg a kulcsok tömbjét a részfa struktúrájának eléréséhez.

//<input type="file" name="my-form[details][avatar]" multiple>
$file = $request->getFile(['my-form', 'details', 'avatar']);

Mivel a kívülről érkező adatokat nem bízhatja meg, és ezért nem támaszkodik a struktúra formájára, ez a módszer biztonságosabb, mint a $request->getFiles()['my-form']['details']['avatar'], amely hibásan működhet.

getFiles(): array

Visszaadja a feltöltési fájlok fáját egy normalizált struktúrában, amelynek minden egyes levele a Nette\Http\FileUpload egy példánya:

$files = $httpRequest->getFiles();

getCookie(string $key): string|array|null

Visszaad egy cookie-t vagy null, ha nem létezik.

$sessId = $httpRequest->getCookie('sess_id');

getCookies(): array

Visszaadja az összes sütit:

$cookies = $httpRequest->getCookies();

getMethod(): string

Visszaadja a HTTP-módszert, amellyel a kérés történt.

echo $httpRequest->getMethod(); // GET, POST, PUT, HEAD, PUT

isMethod(string $method)bool

Ellenőrzi a HTTP-módszert, amellyel a kérés érkezett. A paraméter nem érzékeny a nagy- és kisbetűkre.

if ($httpRequest->isMethod('GET')) // ...

getHeader(string $header): ?string

Visszaad egy HTTP-fejlécet vagy a null címet, ha az nem létezik. A paraméter nem érzékeny a nagy- és kisbetűkre:

$userAgent = $httpRequest->getHeader('User-Agent');

getHeaders(): array

Az összes HTTP-fejlécet asszociatív tömbként adja vissza:

$headers = $httpRequest->getHeaders();
echo $headers['Content-Type'];

isSecured(): bool

A kapcsolat titkosított (HTTPS)? Lehet, hogy a megfelelő működéshez proxy-t kell beállítania.

isSameSite(): bool

A kérés ugyanarról az (al)tartományról érkezik, és egy linkre kattintva indult? A Nette a _nss cookie-t (korábban nette-samesite) használja ennek felismerésére.

isAjax(): bool

Ez egy AJAX-kérés?

getRemoteAddress(): ?string

Visszaadja a felhasználó IP-címét. A megfelelő működéshez szükség lehet egy proxy beállítás ára.

getRemoteHost(): ?string

Visszaadja a felhasználó IP-címének DNS-fordítását. A megfelelő működéshez szükség lehet egy proxy beállítás ára.

getBasicCredentials(): ?string

Visszaadja a Basic HTTP hitelesítési hitelesítő adatokat.

[$user, $password] = $httpRequest->getBasicCredentials();

getRawBody(): ?string

Visszaadja a HTTP-kérelem testét:

$body = $httpRequest->getRawBody();

detectLanguage(array $langs): ?string

Nyelv észlelése. A $lang paramétereként átadjuk az alkalmazás által támogatott nyelvek tömbjét, és a böngésző által preferált nyelvet adja vissza. Ez nem varázslat, a módszer csak a Accept-Language fejlécet használja. Ha nem talál egyezést, akkor a null értéket adja vissza.

// A böngésző által küldött fejléc: cs,en-us;q=0.8,en;q=0.5,sl;q=0.3

$langs = ['hu', 'pl', 'en']; // az alkalmazásban támogatott nyelvek
echo $httpRequest->detectLanguage($langs); // en

RequestFactory

Az aktuális HTTP-kérelem objektumát a Nette\Http\RequestFactory hozza létre. Ha olyan alkalmazást ír, amely nem használ DI konténert, akkor a következőképpen hoz létre egy kérést:

$factory = new Nette\Http\RequestFactory;
$httpRequest = $factory->fromGlobals();

A RequestFactory a fromGlobals() meghívása előtt konfigurálható. A $factory->setBinary() segítségével kikapcsolhatjuk az érvénytelen UTF-8 szekvenciákból származó bemeneti paraméterek minden szanálását. És beállíthatunk egy proxy szervert is, ami fontos a felhasználó IP-címének helyes felismeréséhez a $factory->setProxy(...) segítségével.

Az URL-eket szűrők segítségével megtisztíthatjuk azoktól a karakterektől, amelyek a különböző más weboldalakon rosszul megvalósított kommentrendszerek miatt kerülhetnek bele:

// szóközök eltávolítása az útvonalból
$requestFactory->urlFilters['path']['%20'] = '';

// pont, vessző vagy jobb oldali zárójel eltávolítása az URL végéről
$requestFactory->urlFilters['url']['[.,)]$'] = '';

// megtisztítja az elérési utat a duplázott írásjelektől (alapértelmezett szűrő).
$requestFactory->urlFilters['path']['/{2,}'] = '/';

Feltöltött fájlok

A Nette\Http\Request::getFiles() módszer egy normalizált struktúrájú, feltöltött fájlokat tartalmazó fát ad vissza, amelynek minden egyes levele a Nette\Http\FileUpload példánya. Ezek az objektumok tartalmazzák a feltöltött fájlokat, amelyeket a <input type=file> form elem által megadott adatokat.

A struktúra tükrözi a HTML elemeinek elnevezését. A legegyszerűbb példában ez lehet egy egyetlen elnevezett űrlapelem, amelyet a következőképpen küldtek be:

<input type="file" name="avatar">

Ebben az esetben a $request->getFiles() tömböt ad vissza:

[
	'avatar' => /* FileUpload instance */
]

A FileUpload objektum akkor is létrejön, ha a felhasználó nem töltött fel semmilyen fájlt, vagy a feltöltés sikertelen volt. A hasFile() módszer true-t ad vissza, ha egy fájl elküldésre került:

$request->getFile('avatar')->hasFile();

Tömbös jelölést használó bemenet esetén a név:

<input type="file" name="my-form[details][avatar]">

A visszaadott fa végül így néz ki:

[
	'my-form' => [
		'details' => [
			'avatar' => /* FileUpload instance */
		],
	],
]

A fájlok tömbjeit is létrehozhatja:

<input type="file" name="my-form[details][avatars][] multiple">

Ebben az esetben a struktúra így néz ki:

[
	'my-form' => [
		'details' => [
			'avatars' => [
				0 => /* FileUpload instance */,
				1 => /* FileUpload instance */,
				2 => /* FileUpload instance */,
			],
		],
	],
]

A beágyazott tömb 1. indexének elérésének legjobb módja a következő:

$file = $request->getFile(['my-form', 'details', 'avatars', 1]);
if ($file instanceof FileUpload) {
	// ...
}

Mivel kívülről nem bízhatunk az adatokban, és ezért nem támaszkodunk a struktúra formájára, ez a módszer biztonságosabb, mint a $request->getFiles()['my-form']['details']['avatars'][1], amely meghibásodhat.

A FileUpload módszerek áttekintése

hasFile(): bool

Visszaadja a true értéket, ha a felhasználó feltöltött egy fájlt.

isOk(): bool

Visszaadja a true értéket, ha a fájl feltöltése sikeres volt.

getError(): int

Visszaadja a feltöltött fájlhoz tartozó hibakódot. Ez az UPLOAD_ERR_XXX konstansok egyike. Ha a fájl feltöltése sikeres volt, akkor a UPLOAD_ERR_OK értéket adja vissza.

move(string $dest)

Egy feltöltött fájl áthelyezése egy új helyre. Ha a célfájl már létezik, a rendszer felülírja azt.

$file->move('/path/to/files/name.ext');

getContents(): ?string

Visszaadja a feltöltött fájl tartalmát. Ha a feltöltés nem volt sikeres, akkor a null értéket adja vissza.

getContentType(): ?string

A feltöltött fájl MIME-tartalomtípusát az aláírása alapján állapítja meg. Ha a feltöltés nem volt sikeres, vagy a felismerés sikertelen, akkor a null címet adja vissza.

PHP kiterjesztést igényel fileinfo.

getUntrustedName(): string

Visszaadja a böngésző által megadott eredeti fájlnevet.

Ne bízzon az e módszer által visszaadott értékben. Egy ügyfél rosszindulatú fájlnevet küldhet azzal a szándékkal, hogy megrongálja vagy feltörje az alkalmazást.

getSanitizedName(): string

Visszaadja a szanált fájlnevet. Csak ASCII karaktereket tartalmaz. [a-zA-Z0-9.-]. Ha a név nem tartalmaz ilyen karaktereket, akkor az ‘unknown’ értéket adja vissza. Ha a fájl JPEG, PNG, GIF vagy WebP kép, akkor a megfelelő fájlkiterjesztést adja vissza.

PHP kiterjesztés szükséges fileinfo.

getSuggestedExtension(): ?string

Visszaadja az észlelt MIME-típusnak megfelelő fájlkiterjesztést (pont nélkül).

PHP-bővítményt igényel fileinfo.

getUntrustedFullPath(): string

Visszaadja a böngésző által a könyvtár feltöltése során megadott eredeti teljes elérési utat. A teljes elérési útvonal csak a PHP 8.1 és újabb verziókban érhető el. A korábbi verziókban ez a módszer a nem megbízható fájlnevet adja vissza.

Ne bízzon az e metódus által visszaadott értékben. Egy ügyfél rosszindulatú fájlnevet küldhet azzal a szándékkal, hogy megrongálja vagy feltörje az alkalmazást.

getSize(): int

Visszaadja a feltöltött fájl méretét. Ha a feltöltés nem volt sikeres, akkor 0-t ad vissza.

getTemporaryFile(): string

Visszaadja a feltöltött fájl ideiglenes helyének elérési útvonalát. Ha a feltöltés nem volt sikeres, akkor a '' értéket adja vissza.

isImage(): bool

Visszaadja a true értéket, ha a feltöltött fájl JPEG, PNG, GIF vagy WebP kép. A felismerés az aláírás alapján történik. A teljes fájl sértetlenségét nem ellenőrzi. Azt, hogy egy kép nem sérült-e, például a betöltési próbálkozással állapíthatja meg.

PHP bővítményt igényel: fileinfo.

getImageSize(): ?array

Visszaad egy pár [width, height] a feltöltött kép méreteivel. Ha a feltöltés nem volt sikeres, vagy nem érvényes kép, akkor a null visszatér.

toImage(): Nette\Utils\Image

Képet tölt be Image objektumként. Ha a feltöltés nem volt sikeres vagy nem érvényes kép, akkor a Nette\Utils\ImageException kivételt dob.

verzió: 4.0