Solicitud HTTP
Nette encapsula la petición HTTP en objetos con una API comprensible a la vez que proporciona un filtro de desinfección.
Una petición HTTP es un objeto Nette\Http\Request, que
se obtiene pasándolo mediante inyección de
dependencia. En los presentadores basta con llamar a $httpRequest = $this->getHttpRequest()
.
Lo importante es que Nette al crear este objeto, limpia todos los parámetros de entrada GET, POST y COOKIE así como las URLs de caracteres de control y secuencias UTF-8 inválidas. Así puede seguir trabajando con los datos de forma segura. Los datos limpiados se utilizan entonces en presentadores y formularios.
Nette\Http\Request
Este objeto es inmutable. No tiene setters, sólo tiene uno llamado wither withUrl()
, que no cambia el objeto,
pero devuelve una nueva instancia con un valor modificado.
withUrl (Nette\Http\UrlScript $url): Nette\Http\Request
Devuelve un clon con una URL diferente.
getUrl(): Nette\Http\UrlScript
Devuelve la URL de la petición como objeto UrlScript.
$url = $httpRequest->getUrl();
echo $url; // https://nette.org/en/documentation?action=edit
echo $url->getHost(); // nette.org
Advertencia: Los navegadores no envían fragmentos al servidor, por lo que $url->getFragment()
devolverá una
cadena vacía.
getQuery (?string $key=null): string|array|null
Devuelve los parámetros de la petición GET:
$all = $httpRequest->getQuery(); // array de todos los parámetros URL
$id = $httpRequest->getQuery('id'); // devuelve el parámetro GET 'id' (o null)
getPost (?string $key=null): string|array|null
Devuelve los parámetros de la solicitud POST:
$all = $httpRequest->getPost(); // array de todos los parámetros POST
$id = $httpRequest->getPost('id'); // devuelve el parámetro POST 'id' (o null)
getFile (string|string[] $key): Nette\Http\FileUpload|array|null
Devuelve la carga como objeto Nette\Http\FileUpload:
$file = $httpRequest->getFile('avatar');
if ($archivo->tieneArchivo()) { // ¿se ha subido algún archivo?
$file->getUntrustedName(); // nombre del fichero enviado por el usuario
$file->getSanitizedName(); // el nombre sin caracteres peligrosos
}
Especifica un array de claves para acceder a la estructura del subárbol.
//<input type="file" name="my-form[details][avatar]" multiple>
$file = $request->getFile(['my-form', 'details', 'avatar']);
Debido a que no se puede confiar en los datos desde el exterior y por lo tanto no depende de la forma de la estructura, este
método es más seguro que $request->getFiles()['my-form']['details']['avatar']
que puede fallar.
getFiles(): array
Devuelve un árbol de archivos de carga en una estructura normalizada, con cada hoja como una instancia de Nette\Http\FileUpload:
$files = $httpRequest->getFiles();
getCookie (string $key): string|array|null
Devuelve una cookie o null
si no existe.
$sessId = $httpRequest->getCookie('sess_id');
getCookies(): array
Devuelve todas las cookies:
$cookies = $httpRequest->getCookies();
getMethod(): string
Devuelve el método HTTP con el que se realizó la petición.
echo $httpRequest->getMethod(); // GET, POST, HEAD, PUT
isMethod (string $method): bool
Comprueba el método HTTP con el que se realizó la solicitud. El parámetro no distingue entre mayúsculas y minúsculas.
if ($httpRequest->isMethod('GET')) // ...
getHeader (string $header): ?string
Devuelve una cabecera HTTP o null
si no existe. El parámetro no distingue entre mayúsculas y minúsculas:
$userAgent = $httpRequest->getHeader('User-Agent');
getHeaders(): array
Devuelve todas las cabeceras HTTP como matriz asociativa:
$headers = $httpRequest->getHeaders();
echo $headers['Content-Type'];
isSecured(): bool
¿Está cifrada la conexión (HTTPS)? Es posible que tenga que configurar un proxy para que funcione correctamente.
isSameSite(): bool
¿La solicitud procede del mismo (sub)dominio y se inicia al hacer clic en un enlace? Nette utiliza la cookie _nss
(antes nette-samesite
) para detectarlo.
isAjax(): bool
¿Es una petición AJAX?
getRemoteAddress(): ?string
Devuelve la dirección IP del usuario. Es posible que tenga que configurar un proxy para que funcione correctamente.
getRemoteHost(): ?string
Devuelve la traducción DNS de la dirección IP del usuario. Es posible que tenga que configurar un proxy para que funcione correctamente.
getBasicCredentials(): ?string
Devuelve las credenciales básicas de autenticación HTTP.
[$user, $password] = $httpRequest->getBasicCredentials();
getRawBody(): ?string
Devuelve el cuerpo de la petición HTTP:
$body = $httpRequest->getRawBody();
detectLanguage (array $langs): ?string
Detecta el idioma. Como parámetro $lang
, pasamos un array de idiomas que soporta la aplicación, y devuelve el
preferido por navegador. No es magia, el método sólo utiliza la cabecera Accept-Language
. Si no hay coincidencias,
devuelve null
.
// Cabecera enviada por el navegador: Accept-Language: cs,en-us;q=0.8,en;q=0.5,sl;q=0.3
$langs = ['hu', 'pl', 'en']; // idiomas soportados en la aplicación
echo $httpRequest->detectLanguage($langs); // en
RequestFactory
El objeto de la petición HTTP actual es creado por Nette\Http\RequestFactory. Si está escribiendo una aplicación que no utiliza un contenedor DI, cree una petición de la siguiente manera:
$factory = new Nette\Http\RequestFactory;
$httpRequest = $factory->fromGlobals();
RequestFactory puede configurarse antes de llamar a fromGlobals()
. Podemos deshabilitar toda la sanitización de
parámetros de entrada de secuencias UTF-8 inválidas usando $factory->setBinary()
. Y también configurar un
servidor proxy, que es importante para la correcta detección de la dirección IP del usuario utilizando
$factory->setProxy(...)
.
Es posible limpiar las URL de caracteres que puedan introducirse en ellas debido a sistemas de comentarios mal implementados en otros sitios web mediante el uso de filtros:
// eliminar espacios de la ruta
$requestFactory->urlFilters['ruta']['%20'] = '';
// eliminar punto, coma o paréntesis derecho del final de la URL
$requestFactory->urlFilters['url']['[.,)]$'] = '';
// limpiar la ruta de barras duplicadas (filtro por defecto)
$requestFactory->urlFilters['path']['/{2,}'] = '/';
Archivos subidos
El método Nette\Http\Request::getFiles()
devuelve un árbol de archivos cargados en una estructura normalizada,
en la que cada hoja es una instancia de Nette\Http\FileUpload. Estos objetos encapsulan los datos
enviados por el elemento de formulario <input type=file>
elemento formulario.
La estructura refleja la nomenclatura de los elementos en HTML. En el ejemplo más simple, esto podría ser un único elemento de formulario con nombre enviado como:
<input type="file" name="avatar">
En este caso, $request->getFiles()
devuelve una matriz:
[
'avatar' => /* FileUpload instance */
]
El objeto FileUpload
se crea aunque el usuario no haya subido ningún archivo o la subida haya fallado. El
método hasFile()
devuelve true si se ha enviado un archivo:
$request->getFile('avatar')->hasFile();
En el caso de una entrada que utilice la notación array para el nombre:
<input type="file" name="my-form[details][avatar]">
el árbol devuelto acaba teniendo este aspecto:
[
'my-form' => [
'details' => [
'avatar' => /* FileUpload instance */
],
],
]
También puede crear matrices de archivos:
<input type="file" name="my-form[details][avatars][] multiple">
En tal caso la estructura se parece:
[
'my-form' => [
'details' => [
'avatars' => [
0 => /* FileUpload instance */,
1 => /* FileUpload instance */,
2 => /* FileUpload instance */,
],
],
],
]
La mejor forma de acceder al índice 1 de una matriz anidada es la siguiente:
$file = $request->getFile(['my-form', 'details', 'avatars', 1]);
if ($file instanceof FileUpload) {
// ...
}
Debido a que no se puede confiar en los datos desde el exterior y por lo tanto no se confía en la forma de la estructura, este
método es más seguro que $request->getFiles()['my-form']['details']['avatars'][1]
que puede fallar.
Visión general de los métodos FileUpload
hasFile(): bool
Devuelve true
si el usuario ha subido un archivo.
isOk(): bool
Devuelve true
si el archivo se ha cargado correctamente.
getError(): int
Devuelve el código de error asociado al archivo cargado. Es una de las constantes UPLOAD_ERR_XXX. Si el archivo se ha cargado correctamente,
devuelve UPLOAD_ERR_OK
.
move (string $dest)
Mueve un archivo cargado a una nueva ubicación. Si el archivo de destino ya existe, se sobrescribirá.
$file->move('/path/to/files/name.ext');
getContents(): ?string
Devuelve el contenido del archivo cargado. Si la carga no se ha realizado correctamente, devuelve null
.
getContentType(): ?string
Detecta el tipo de contenido MIME del archivo cargado basándose en su firma. Si la carga no se ha realizado correctamente
o la detección ha fallado, devuelve null
.
Requiere la extensión PHP fileinfo
.
getUntrustedName(): string
Devuelve el nombre original del archivo tal y como fue enviado por el navegador.
No confíe en el valor devuelto por este método. Un cliente podría enviar un nombre de archivo malicioso con la intención de corromper o hackear su aplicación.
getSanitizedName(): string
Devuelve el nombre de archivo desinfectado. Sólo contiene caracteres ASCII [a-zA-Z0-9.-]
. Si el nombre no
contiene tales caracteres, devuelve ‘desconocido’. Si el archivo es una imagen JPEG, PNG, GIF o WebP, devuelve la extensión
de archivo correcta.
Requiere la extensión PHP fileinfo
.
getSuggestedExtension(): ?string
Devuelve la extensión de archivo apropiada (sin el punto) correspondiente al tipo MIME detectado.
Requiere la extensión PHP fileinfo
.
getUntrustedFullPath(): string
Devuelve la ruta completa original tal y como fue enviada por el navegador durante la carga del directorio. La ruta completa sólo está disponible en PHP 8.1 y superiores. En versiones anteriores, este método devuelve el nombre de archivo no confiable.
No confíe en el valor devuelto por este método. Un cliente podría enviar un nombre de archivo malicioso con la intención de corromper o hackear su aplicación.
getSize(): int
Devuelve el tamaño del archivo subido. Si la subida no tuvo éxito, devuelve 0
.
getTemporaryFile(): string
Devuelve la ruta de la ubicación temporal del archivo subido. Si la carga no se ha realizado correctamente, devuelve
''
.
isImage(): bool
Devuelve true
si el archivo cargado es una imagen JPEG, PNG, GIF o WebP. La detección se basa en su firma. No se
comprueba la integridad de todo el archivo. Puede averiguar si una imagen no está dañada, por ejemplo, intentando cargarla.
Requiere la extensión PHP fileinfo
.
getImageSize(): ?array
Devuelve un par de [width, height]
con las dimensiones de la imagen subida. Si la carga no se ha realizado
correctamente o no es una imagen válida, devuelve null
.
toImage(): Nette\Utils\Image
Carga una imagen como objeto Image. Si la carga no se ha realizado
correctamente o no es una imagen válida, lanza una excepción Nette\Utils\ImageException
.