Richiesta HTTP
Nette incapsula la richiesta HTTP in oggetti con un'API comprensibile e fornisce un filtro di sanificazione.
La richiesta HTTP è rappresentata dall'oggetto Nette\Http\Request. Se si lavora con Nette, questo oggetto
viene creato automaticamente dal framework e può essere passato tramite dependency injection. Nei presenter, è sufficiente
chiamare il metodo $this->getHttpRequest()
. Se si lavora al di fuori del framework Nette, è possibile creare
l'oggetto utilizzando RequestFactory.
Un grande vantaggio di Nette è che, al momento della creazione dell'oggetto, sanifica automaticamente tutti i parametri di input GET, POST, COOKIE e gli URL dai caratteri di controllo e dalle sequenze UTF-8 non valide. È quindi possibile lavorare in modo sicuro con questi dati. I dati sanificati vengono successivamente utilizzati nei presentatori e nei moduli.
Richiesta Nette Http
Questo oggetto è immutabile. Non ha setter, ha solo un cosiddetto wither withUrl()
, che non modifica l'oggetto,
ma restituisce una nuova istanza con un valore modificato.
withUrl (Nette\Http\UrlScript $url): Nette\Http\Request
Restituisce un clone con un URL diverso.
getUrl(): Nette\Http\UrlScript
Restituisce l'URL della richiesta come oggetto UrlScript.
$url = $httpRequest->getUrl();
echo $url; // https://nette.org/en/documentation?action=edit
echo $url->getHost(); // nette.org
Attenzione: I browser non inviano un frammento al server, quindi $url->getFragment()
restituirà una
stringa vuota.
getQuery (?string $key=null): string|array|null
Restituisce i parametri della richiesta GET:
$all = $httpRequest->getQuery(); // array di tutti i parametri URL
$id = $httpRequest->getQuery('id'); // restituisce il parametro GET 'id' (o null)
getPost (?string $key=null): string|array|null
Restituisce i parametri della richiesta POST:
$all = $httpRequest->getPost(); // array di tutti i parametri POST
$id = $httpRequest->getPost('id'); // restituisce il parametro POST 'id' (o null)
getFile (string|string[] $key): Nette\Http\FileUpload|array|null
Restituisce il caricamento come oggetto Nette\Http\FileUpload:
$file = $httpRequest->getFile('avatar');
if ($file->hasFile()) { // è stato caricato un file?
$file->getUntrustedName(); // nome del file inviato dall'utente
$file->getSanitizedName(); // il nome senza caratteri pericolosi
}
Specificare un array di chiavi per accedere alla struttura del sottoalbero.
//<input type="file" name="my-form[details][avatar]" multiple>
$file = $request->getFile(['my-form', 'details', 'avatar']);
Poiché non ci si può fidare dei dati provenienti dall'esterno e quindi non si fa affidamento sulla forma della struttura,
questo metodo è più sicuro rispetto a $request->getFiles()['my-form']['details']['avatar']
che può fallire.
getFiles(): array
Restituisce un albero di file di upload in una struttura normalizzata, con ogni foglia un'istanza di Nette\Http\FileUpload:
$files = $httpRequest->getFiles();
getCookie (string $key): string|array|null
Restituisce un cookie o null
se non esiste.
$sessId = $httpRequest->getCookie('sess_id');
getCookies(): array
Restituisce tutti i cookie:
$cookies = $httpRequest->getCookies();
getMethod(): string
Restituisce il metodo HTTP con cui è stata effettuata la richiesta.
echo $httpRequest->getMethod(); // GET, POST, HEAD, PUT
isMethod (string $method): bool
Verifica il metodo HTTP con cui è stata effettuata la richiesta. Il parametro non fa distinzione tra maiuscole e minuscole.
if ($httpRequest->isMethod('GET')) // ...
getHeader (string $header): ?string
Restituisce un'intestazione HTTP o null
se non esiste. Il parametro non fa distinzione tra maiuscole e
minuscole:
$userAgent = $httpRequest->getHeader('User-Agent');
getHeaders(): array
Restituisce tutte le intestazioni HTTP come array associativo:
$headers = $httpRequest->getHeaders();
echo $headers['Content-Type'];
isSecured(): bool
La connessione è criptata (HTTPS)? Potrebbe essere necessario impostare un proxy per una corretta funzionalità.
isSameSite(): bool
La richiesta proviene dallo stesso (sotto)dominio ed è iniziata facendo clic su un link? Nette utilizza il cookie
_nss
(ex nette-samesite
) per rilevarlo.
isAjax(): bool
È una richiesta AJAX?
getRemoteAddress(): ?string
Restituisce l'indirizzo IP dell'utente. Potrebbe essere necessario impostare un proxy per una corretta funzionalità.
getRemoteHost(): ?string
Restituisce la traduzione DNS dell'indirizzo IP dell'utente. Potrebbe essere necessario impostare un proxy per una corretta funzionalità.
getBasicCredentials(): ?string
Restituisce le credenziali di autenticazione HTTP di base.
[$user, $password] = $httpRequest->getBasicCredentials();
getRawBody(): ?string
Restituisce il corpo della richiesta HTTP:
$body = $httpRequest->getRawBody();
detectLanguage (array $langs): ?string
Rileva la lingua. Come parametro $lang
, si passa un array di lingue supportate dall'applicazione e viene
restituita quella preferita dal browser. Non è una magia, il metodo utilizza semplicemente l'intestazione
Accept-Language
. Se non c'è corrispondenza, restituisce null
.
// Intestazione inviata dal browser: Accept-Language: cs,en-us;q=0.8,en;q=0.5,sl;q=0.3
$langs = ['hu', 'pl', 'en']; // lingue supportate nell'applicazione
echo $httpRequest->detectLanguage($langs); // en
Fabbrica di richieste
La classe Nette\Http\RequestFactory viene
utilizzata per creare un'istanza di Nette\Http\Request
, che rappresenta la richiesta HTTP corrente. (Se si lavora con
Nette, l'oggetto richiesta HTTP viene creato automaticamente dal framework).
$factory = new Nette\Http\RequestFactory;
$httpRequest = $factory->fromGlobals();
Il metodo fromGlobals()
crea un oggetto richiesta basato sulle variabili globali PHP correnti ($_GET
,
$_POST
, $_COOKIE
, $_FILES
e $_SERVER
). Durante la creazione dell'oggetto,
pulisce automaticamente tutti i parametri di input GET, POST, COOKIE e l'URL dai caratteri di controllo e dalle sequenze
UTF-8 non valide, garantendo così la sicurezza quando si lavorerà con questi dati in seguito.
La RequestFactory può essere configurata prima di chiamare fromGlobals()
:
- con il metodo
$factory->setBinary()
si può disabilitare la pulizia automatica dei parametri di input dai caratteri di controllo e dalle sequenze UTF-8 non valide. - con il metodo
$factory->setProxy(...)
si specifica l'indirizzo IP del server proxy, necessario per il corretto rilevamento dell'indirizzo IP dell'utente.
RequestFactory consente di definire filtri che trasformano automaticamente parti della richiesta di URL. Questi filtri rimuovono dagli URL i caratteri indesiderati che possono essere stati inseriti, ad esempio, da un'errata implementazione dei sistemi di commento su vari siti web:
// rimozione degli spazi dal percorso
$requestFactory->urlFilters['path']['%20'] = '';
// rimozione di un punto, di una virgola o di una parentesi destra dalla fine dell'URI
$requestFactory->urlFilters['url']['[.,)]$'] = '';
// pulizia del percorso da doppi slash (filtro predefinito)
$requestFactory->urlFilters['path']['/{2,}'] = '/';
La prima chiave 'path'
o 'url'
determina quale parte dell'URL sarà applicata al filtro. La seconda
chiave è un'espressione regolare da cercare e il valore è la sostituzione da usare al posto del testo trovato.
File caricati
Il metodo Nette\Http\Request::getFiles()
restituisce un albero di file caricati in una struttura normalizzata, con
ogni foglia un'istanza di Nette\Http\FileUpload. Questi
oggetti incapsulano i dati inviati dall'elemento del form. <input type=file>
elemento del modulo.
La struttura riflette la denominazione degli elementi in HTML. Nell'esempio più semplice, potrebbe trattarsi di un singolo elemento del modulo con nome, inviato come:
<input type="file" name="avatar">
In questo caso, $request->getFiles()
restituisce un array:
[
'avatar' => /* FileUpload instance */
]
L'oggetto FileUpload
viene creato anche se l'utente non ha caricato alcun file o il caricamento è fallito. Il
metodo hasFile()
restituisce true se è stato inviato un file:
$request->getFile('avatar')->hasFile();
Nel caso di un input che utilizza la notazione array per il nome:
<input type="file" name="my-form[details][avatar]">
l'albero restituito finisce per assomigliare a questo:
[
'my-form' => [
'details' => [
'avatar' => /* FileUpload instance */
],
],
]
È anche possibile creare array di file:
<input type="file" name="my-form[details][avatars][] multiple">
In questo caso la struttura appare come:
[
'my-form' => [
'details' => [
'avatars' => [
0 => /* FileUpload instance */,
1 => /* FileUpload instance */,
2 => /* FileUpload instance */,
],
],
],
]
Il modo migliore per accedere all'indice 1 di un array annidato è il seguente:
$file = $request->getFile(['my-form', 'details', 'avatars', 1]);
if ($file instanceof FileUpload) {
// ...
}
Poiché non ci si può fidare dei dati provenienti dall'esterno e quindi non si fa affidamento sulla forma della struttura,
questo metodo è più sicuro rispetto a $request->getFiles()['my-form']['details']['avatars'][1]
che può
fallire.
Panoramica dei metodi di FileUpload
hasFile(): bool
Restituisce true
se l'utente ha caricato un file.
isOk(): bool
Restituisce true
se il file è stato caricato con successo.
getError(): int
Restituisce il codice di errore associato al file caricato. È una delle costanti UPLOAD_ERR_XXX. Se il file è stato caricato con successo,
restituisce UPLOAD_ERR_OK
.
move (string $dest)
Sposta un file caricato in una nuova posizione. Se il file di destinazione esiste già, verrà sovrascritto.
$file->move('/path/to/files/name.ext');
getContents(): ?string
Restituisce il contenuto del file caricato. Se il caricamento non è riuscito, restituisce null
.
getContentType(): ?string
Rileva il tipo di contenuto MIME del file caricato in base alla sua firma. Se il caricamento non è riuscito o il rilevamento
non è andato a buon fine, restituisce null
.
Richiede l'estensione PHP fileinfo
.
getUntrustedName(): string
Restituisce il nome originale del file come inviato dal browser.
Non fidarsi del valore restituito da questo metodo. Un client potrebbe inviare un nome di file dannoso con l'intento di corrompere o hackerare l'applicazione.
getSanitizedName(): string
Restituisce il nome del file sanificato. Contiene solo caratteri ASCII [a-zA-Z0-9.-]
. Se il nome non contiene tali
caratteri, restituisce “unknown”. Se il file è un'immagine JPEG, PNG, GIF o WebP, restituisce l'estensione corretta.
Richiede l'estensione PHP fileinfo
.
getSuggestedExtension(): ?string
Restituisce l'estensione di file appropriata (senza il punto) corrispondente al tipo MIME rilevato.
Richiede l'estensione PHP fileinfo
.
getUntrustedFullPath(): string
Restituisce il percorso completo originale inviato dal browser durante il caricamento della directory. Il percorso completo è disponibile solo in PHP 8.1 e versioni successive. Nelle versioni precedenti, questo metodo restituisce il nome del file non attendibile.
Non fidarsi del valore restituito da questo metodo. Un client potrebbe inviare un nome di file dannoso con l'intenzione di corrompere o hackerare l'applicazione.
getSize(): int
Restituisce la dimensione del file caricato. Se il caricamento non è riuscito, restituisce 0
.
getTemporaryFile(): string
Restituisce il percorso della posizione temporanea del file caricato. Se il caricamento non è riuscito, restituisce
''
.
isImage(): bool
Restituisce true
se il file caricato è un'immagine JPEG, PNG, GIF o WebP. Il rilevamento si basa sulla sua
firma. L'integrità dell'intero file non viene controllata. È possibile scoprire se un'immagine non è danneggiata, ad esempio
provando a caricarla.
Richiede l'estensione PHP fileinfo
.
getImageSize(): ?array
Restituisce una coppia di elementi [width, height]
con le dimensioni dell'immagine caricata. Se il caricamento non
è riuscito o non è un'immagine valida, restituisce null
.
toImage(): Nette\Utils\Image
Carica un'immagine come oggetto Image. Se il caricamento non è avvenuto
con successo o non è un'immagine valida, viene lanciata un'eccezione Nette\Utils\ImageException
.