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.
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
Uyarı: Tarayıcılar sunucuya bir parça göndermez, bu nedenle $url->getFragment()
boş bir dize
döndürecektir.
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.