HTTP İsteği

Nette, HTTP isteğini anlaşılabilir bir API ile nesneler halinde kapsüllerken bir sanitizasyon filtresi sağlar.

Bir HTTP isteği, bağımlılık enjeksiyonu kullanarak geçirdiğiniz bir Nette\Http\Request nesnesidir. Sunucularda basitçe $httpRequest = $this->getHttpRequest() adresini çağırın.

Önemli olan, Nette'in bu nesneyi oluştururken tüm GET, POST ve COOKIE giriş parametrelerinin yanı sıra kontrol karakterlerinin ve geçersiz UTF-8 dizilerinin URL'lerini de temizlemesidir. Böylece verilerle güvenle çalışmaya devam edebilirsiniz. Temizlenen veriler daha sonra sunumlarda ve formlarda kullanılır.

Kurulum ve gereksinimler

Nette\Http\Request

Bu nesne değişmezdir. Ayarlayıcıları yoktur, yalnızca bir tane wither withUrl() vardır, bu da nesneyi değiştirmez, ancak değiştirilmiş bir değere sahip yeni bir örnek döndürür.

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

Farklı bir URL ile bir klon döndürür.

getUrl(): Nette\Http\UrlScript

İsteğin URL'sini UrlScript nesnesi olarak döndürür.

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

Tarayıcılar sunucuya bir parça göndermez, bu nedenle $url->getFragment() boş bir dize döndürür.

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

GET istek parametrelerini döndürür:

$all = $httpRequest->getQuery(); // tüm URL parametrelerinin dizisi
$id = $httpRequest->getQuery('id'); // GET parametresi 'id' (veya null) döndürür

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

POST istek parametrelerini döndürür:

$all = $httpRequest->getPost(); // tüm POST parametrelerinin dizisi
$id = $httpRequest->getPost('id'); // POST parametresi 'id' (veya null) döndürür

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

Yüklemeyi nesne olarak döndürür Nette\Http\FileUpload:

$file = $httpRequest->getFile('avatar');
if ($file->hasFile()) { // herhangi bir dosya yüklendi mi?
	$file->getUntrustedName(); // kullanıcı tarafından gönderilen dosyanın adı
	$file->getSanitizedName(); // tehlikeli karakterler içermeyen ad
}

Alt ağaç yapısına erişmek için bir anahtar dizisi belirtin.

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

Dışarıdan gelen verilere güvenemediğiniz ve bu nedenle yapının biçimine güvenmediğiniz için, bu yöntem $request->getFiles()['my-form']['details']['avatar']bu da başarısız olabilir.

getFiles(): array

Normalleştirilmiş bir yapıda yükleme dosyalarının ağacını döndürür, her yaprak Nette\Http\FileUpload'un bir örneğidir:

$files = $httpRequest->getFiles();

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

Bir çerezi veya yoksa null adresini döndürür.

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

getCookies(): array

Tüm çerezleri döndürür:

$cookies = $httpRequest->getCookies();

getMethod(): string

İsteğin yapıldığı HTTP yöntemini döndürür.

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

isMethod(string $method)bool

İsteğin hangi HTTP yöntemiyle yapıldığını kontrol eder. Parametre büyük/küçük harfe duyarlı değildir.

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

getHeader(string $header): ?string

Bir HTTP başlığını veya yoksa null adresini döndürür. Parametre büyük/küçük harfe duyarlı değildir:

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

getHeaders(): array

Tüm HTTP başlıklarını ilişkisel dizi olarak döndürür:

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

isSecured(): bool

Bağlantı şifreli mi (HTTPS)? Düzgün işlevsellik için bir proxy ayarlamanız gerekebilir.

isSameSite(): bool

İstek aynı (alt) etki alanından mı geliyor ve bir bağlantıya tıklanarak mı başlatılıyor? Nette bunu tespit etmek için _nss çerezini (eski adıyla nette-samesite) kullanır.

isAjax(): bool

Bu bir AJAX isteği mi?

getRemoteAddress(): ?string

Kullanıcının IP adresini döndürür. Düzgün işlevsellik için bir proxy ayarlamanız gerekebilir.

getRemoteHost(): ?string

Kullanıcının IP adresinin DNS çevirisini döndürür. Düzgün işlevsellik için bir proxy ayarlamanız gerekebilir.

getBasicCredentials(): ?string

Temel HTTP kimlik doğrulama bilgilerini döndürür.

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

getRawBody(): ?string

HTTP isteğinin gövdesini döndürür:

$body = $httpRequest->getRawBody();

detectLanguage(array $langs): ?string

Dili algılar. Parametre olarak $lang, uygulamanın desteklediği bir dizi dili iletiriz ve tarayıcı tarafından tercih edileni döndürür. Bu sihirli değildir, yöntem sadece Accept-Language başlığını kullanır. Eşleşme bulunamazsa, null döndürür.

// Tarayıcı tarafından gönderilen başlık: Accept-Language: cs,en-us;q=0.8,en;q=0.5,sl;q=0.3

$langs = ['hu', 'pl', 'en']; // uygulamada desteklenen diller
echo $httpRequest->detectLanguage($langs); // en

RequestFactory

Geçerli HTTP isteğinin nesnesi Nette\Http\RequestFactory tarafından oluşturulur. DI konteyneri kullanmayan bir uygulama yazıyorsanız, aşağıdaki gibi bir istek oluşturursunuz:

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

RequestFactory, fromGlobals() adresini çağırmadan önce yapılandırılabilir. $factory->setBinary() adresini kullanarak geçersiz UTF-8 dizilerinden gelen girdi parametrelerinin tüm sanitizasyonunu devre dışı bırakabiliriz. Ayrıca $factory->setProxy(...) adresini kullanarak kullanıcının IP adresinin doğru algılanması için önemli olan bir proxy sunucusu da kurabiliriz.

Filtreler kullanarak URL'leri, diğer çeşitli web sitelerindeki kötü uygulanan yorum sistemleri nedeniyle içlerine girebilecek karakterlerden temizlemek mümkündür:

// yoldan boşlukları kaldırın
$requestFactory->urlFilters['path']['%20'] = '';

// URL'nin sonundaki nokta, virgül veya sağ parantezi kaldırın
$requestFactory->urlFilters['url']['[.,)]$'] = '';

// yolu yinelenen bölü çizgilerinden temizle (varsayılan filtre)
$requestFactory->urlFilters['path']['/{2,}'] = '/';

Yüklenen Dosyalar

Nette\Http\Request::getFiles() yöntemi normalleştirilmiş bir yapıda yükleme dosyalarından oluşan bir ağaç döndürür ve her yaprak Nette\Http\FileUpload öğesinin bir örneğidir. <input type=file> form öğesi.

Yapı, HTML'deki öğelerin adlandırılmasını yansıtır. En basit örnekte bu, şu şekilde gönderilen tek bir adlandırılmış form öğesi olabilir:

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

Bu durumda, $request->getFiles() adresi dizi döndürür:

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

Kullanıcı herhangi bir dosya yüklememiş veya yükleme başarısız olmuş olsa bile FileUpload nesnesi oluşturulur. Bir dosya gönderilmişse hasFile() yöntemi true değerini döndürür:

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

Ad için dizi gösterimi kullanan bir girdi olması durumunda:

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

Geri dönen ağaç bu şekilde görünür:

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

Ayrıca dosya dizileri de oluşturabilirsiniz:

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

Böyle bir durumda yapı şöyle görünür:

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

İç içe geçmiş bir dizinin 1. dizinine erişmenin en iyi yolu aşağıdaki gibidir:

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

Dışarıdan gelen verilere güvenemediğiniz ve bu nedenle yapının biçimine güvenmediğiniz için, bu yöntem $request->getFiles()['my-form']['details']['avatars'][1]bu da başarısız olabilir.

FileUpload Yöntemlerine Genel Bakış

hasFile(): bool

Kullanıcı bir dosya yüklediyse true döndürür.

isOk(): bool

Dosya başarıyla yüklenmişse true döndürür.

getError(): int

Yüklenen dosya ile ilişkili hata kodunu döndürür. UPLOAD_ERR_XXX sabitlerinden biri olabilir. Dosya başarıyla yüklenmişse, UPLOAD_ERR_OK döndürür.

move(string $dest)

Yüklenen bir dosyayı yeni bir konuma taşır. Hedef dosya zaten mevcutsa, üzerine yazılır.

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

getContents(): ?string

Karşıya yüklenen dosyanın içeriğini döndürür. Yükleme başarılı olmadıysa, null döndürür.

getContentType(): ?string

İmzasına dayalı olarak yüklenen dosyanın MIME içerik türünü algılar. Yükleme başarılı olmadıysa veya algılama başarısız olduysa, null döndürür.

PHP uzantısı gerektirir fileinfo.

getUntrustedName(): string

Tarayıcı tarafından gönderilen orijinal dosya adını döndürür.

Bu yöntem tarafından döndürülen değere güvenmeyin. Bir istemci, uygulamanızı bozmak veya hacklemek amacıyla kötü amaçlı bir dosya adı gönderebilir.

getSanitizedName(): string

Temizlenmiş dosya adını döndürür. Yalnızca ASCII karakterleri içerir [a-zA-Z0-9.-]. Ad bu tür karakterler içermiyorsa, ‘bilinmeyen’ döndürür. Dosya JPEG, PNG, GIF veya WebP görüntüsüyse, doğru dosya uzantısını döndürür.

PHP uzantısı gerektirir fileinfo.

getSuggestedExtension(): ?string

Algılanan MIME türüne karşılık gelen uygun dosya uzantısını (nokta olmadan) döndürür.

PHP uzantısı gerektirir fileinfo.

getUntrustedFullPath(): string

Dizin yüklemesi sırasında tarayıcı tarafından gönderilen özgün tam yolu döndürür. Tam yol sadece PHP 8.1 ve üzeri sürümlerde mevcuttur. Önceki sürümlerde bu yöntem güvenilmeyen dosya ismini döndürür.

Bu yöntem tarafından döndürülen değere güvenmeyin. Bir istemci, uygulamanızı bozmak veya hacklemek amacıyla kötü amaçlı bir dosya adı gönderebilir.

getSize(): int

Yüklenen dosyanın boyutunu döndürür. Yükleme başarılı olmadıysa 0 döndürür.

getTemporaryFile(): string

Karşıya yüklenen dosyanın geçici konumunun yolunu döndürür. Yükleme başarılı olmadıysa, '' döndürür.

isImage(): bool

Yüklenen dosya bir JPEG, PNG, GIF veya WebP görüntüsü ise true döndürür. Algılama, imzasına dayanır. Tüm dosyanın bütünlüğü kontrol edilmez. Bir görüntünün bozuk olup olmadığını örneğin yüklemeyi deneyerek öğrenebilirsiniz.

PHP uzantısı gerektirir fileinfo.

getImageSize(): ?array

Bir çift döndürür [width, height] yüklenen resmin boyutlarıyla birlikte. Yükleme başarılı olmadıysa veya geçerli bir görüntü değilse, null döndürür.

toImage(): Nette\Utils\Image

Bir resmi Image nesnesi olarak yükler. Yükleme başarılı değilse veya geçerli bir resim değilse, bir Nette\Utils\ImageException istisnası atar.

versiyon: 4.0