Solicitação HTTP
Nette encapsula a solicitação HTTP em objetos com uma API compreensível enquanto fornece um filtro de higienização.
A solicitação HTTP é representada pelo objeto Nette\Http\Request. Se você trabalha com o Nette, esse
objeto é criado automaticamente pela estrutura e pode ser passado a você por meio de injeção de dependência. Nos apresentadores, você
só precisa chamar o método $this->getHttpRequest()
. Se você trabalha fora da Nette Framework, pode criar
o objeto usando RequestFactory.
Uma das principais vantagens do Nette é que, ao criar o objeto, ele higieniza automaticamente todos os parâmetros de entrada GET, POST, COOKIE, bem como o URL de caracteres de controle e sequências UTF-8 inválidas. Assim, você pode trabalhar com segurança com esses dados. Os dados higienizados são usados posteriormente em apresentadores e formulários.
Nette\Http Solicitação
Este objeto é imutável. Não tem setters, tem apenas um chamado wither withUrl()
, que não muda o objeto, mas
retorna uma nova instância com um valor modificado.
withUrl (Nette\Http\UrlScript $url): Nette\Http\Request
Devolve um clone com uma URL diferente.
getUrl(): Nette\Http\UrlScript
Retorna o URL do pedido como UrlScript do objeto.
$url = $httpRequest->getUrl();
echo $url; // https://nette.org/en/documentation?action=edit
echo $url->getHost(); // nette.org
Aviso: Os navegadores não enviam um fragmento ao servidor, portanto, o site $url->getFragment()
retornará
uma cadeia de caracteres vazia.
getQuery (?string $key=null): string|array|null
Retorna os parâmetros de solicitação GET:
$all = $httpRequest->getQuery(); // matriz de todos os parâmetros de URL
$id = $httpRequest->getQuery('id'); // retorna o parâmetro GET 'id' (ou nulo)
getPost (?string $key=null): string|array|null
Retorna os parâmetros de solicitação de PÓS-PST:
$all = $httpRequest->getPost(); // matriz de todos os parâmetros POST
$id = $httpRequest->getPost('id'); // devolve o parâmetro 'id' do POST (ou nulo)
getFile (string|string[] $key): Nette\Http\FileUpload|array|null
Devolve o upload como objeto Nette\Http\FileUpload:
$file = $httpRequest->getFile('avatar');
if ($file->hasFile()) { // foi feito o upload de algum arquivo?
$file->getUntrustedName(); // nome do arquivo enviado pelo usuário
$file->getSanitizedName(); // o nome sem caracteres perigosos
}
Especifique um conjunto de chaves para acessar a estrutura da sub-árvore.
//<input type="file" name="my-form[details][avatar]" multiple>
$file = $request->getFile(['my-form', 'details', 'avatar']);
Como você não pode confiar nos dados do exterior e, portanto, não confia na forma da estrutura, este método é mais seguro
do que $request->getFiles()['my-form']['details']['avatar']
o que pode falhar.
getFiles(): array
Retorna árvore de arquivos de upload em uma estrutura normalizada, com cada folha uma instância de Nette\Http\FileUpload:
$files = $httpRequest->getFiles();
getCookie (string $key): string|array|null
Devolve um cookie ou null
se ele não existir.
$sessId = $httpRequest->getCookie('sess_id');
getCookies(): array
Devolve todos os cookies:
$cookies = $httpRequest->getCookies();
getMethod(): string
Retorna o método HTTP com o qual a solicitação foi feita.
echo $httpRequest->getMethod(); // GET, POST, HEAD, PUT
isMethod (string $method): bool
Verifica o método HTTP com o qual a solicitação foi feita. O parâmetro não diferencia maiúsculas e minúsculas de minúsculas.
if ($httpRequest->isMethod('GET')) // ...
getHeader (string $header): ?string
Devolve um cabeçalho HTTP ou null
se ele não existir. O parâmetro não diferencia maiúsculas e minúsculas de
minúsculas:
$userAgent = $httpRequest->getHeader('User-Agent');
getHeaders(): array
Devolve todos os cabeçalhos HTTP como matriz associativa:
$headers = $httpRequest->getHeaders();
echo $headers['Content-Type'];
isSecured(): bool
A conexão é criptografada (HTTPS)? Talvez seja necessário configurar um proxy para uma funcionalidade adequada.
isSameSite(): bool
A solicitação vem do mesmo (sub) domínio e é iniciada clicando em um link? Nette utiliza o cookie _nss
(anteriormente nette-samesite
) para detectá-lo.
isAjax(): bool
Trata-se de um pedido AJAX?
getRemoteAddress(): ?string
Devolve o endereço IP do usuário. Pode ser necessário configurar um proxy para uma funcionalidade adequada.
getRemoteHost(): ?string
Retorna a tradução DNS do endereço IP do usuário. Pode ser necessário configurar um proxy para uma funcionalidade adequada.
getBasicCredentials(): ?string
Retorna as credenciais básicas de autenticação HTTP.
[$user, $password] = $httpRequest->getBasicCredentials();
getRawBody(): ?string
Devolve o corpo do pedido HTTP:
$body = $httpRequest->getRawBody();
detectLanguage (array $langs): ?string
Detecta a linguagem. Como parâmetro $lang
, passamos um conjunto de idiomas que o aplicativo suporta, e ele
retorna o preferido pelo navegador. Não é mágico, o método utiliza apenas o cabeçalho Accept-Language
. Se
não for alcançado, ele retorna null
.
// Cabeçalho enviado pelo navegador: Aceitar-Língua: cs,en-us;q=0,8,en;q=0,5,sl;q=0,3
$langs = ['hu', 'pl', 'en']; // idiomas suportados na aplicação
echo $httpRequest->detectLanguage($langs); // pt
RequestFactory
A classe Nette\Http\RequestFactory é usada
para criar uma instância de Nette\Http\Request
, que representa a solicitação HTTP atual. (Se você trabalha com
o Nette, o objeto de solicitação HTTP é criado automaticamente pela estrutura).
$factory = new Nette\Http\RequestFactory;
$httpRequest = $factory->fromGlobals();
O método fromGlobals()
cria um objeto de solicitação com base nas variáveis globais atuais do PHP
($_GET
, $_POST
, $_COOKIE
, $_FILES
e $_SERVER
). Ao criar
o objeto, ele limpa automaticamente todos os parâmetros de entrada GET, POST, COOKIE, bem como o URL de caracteres de controle
e sequências UTF-8 inválidas, o que garante a segurança ao trabalhar com esses dados posteriormente.
O RequestFactory pode ser configurado antes de chamar fromGlobals()
:
- usando o método
$factory->setBinary()
, você pode desativar a limpeza automática dos parâmetros de entrada dos caracteres de controle e das sequências UTF-8 inválidas. - usando o método
$factory->setProxy(...)
, você especifica o endereço IP do servidor proxy, que é necessário para a detecção correta do endereço IP do usuário.
O RequestFactory permite que você defina filtros que transformam automaticamente partes da solicitação de URL. Esses filtros removem caracteres indesejados de URLs que podem ter sido inseridos, por exemplo, pela implementação incorreta de sistemas de comentários em vários sites:
// removendo espaços do caminho
$requestFactory->urlFilters['path']['%20'] = '';
// remoção de um ponto, vírgula ou parêntese à direita do final do URI
$requestFactory->urlFilters['url']['[.,)]$'] = '';
// limpar o caminho de barras duplas (filtro padrão)
$requestFactory->urlFilters['path']['/{2,}'] = '/';
A primeira chave 'path'
ou 'url'
determina a qual parte do URL o filtro será aplicado. A segunda
chave é uma expressão regular a ser pesquisada e o valor é a substituição a ser usada no lugar do texto encontrado.
Arquivos carregados
Método Nette\Http\Request::getFiles()
devolve uma árvore de arquivos de upload em uma estrutura normalizada, com
cada folha uma instância de Nette\Http\FileUpload.
Estes objetos encapsulam os dados enviados pelo <input type=file>
elemento forma.
A estrutura reflete a nomenclatura dos elementos em HTML. No exemplo mais simples, este pode ser um único elemento de formulário nomeado apresentado como:
<input type="file" name="avatar">
Neste caso, o $request->getFiles()
retorna a matriz:
[
'avatar' => /* FileUpload instance */
]
O objeto FileUpload
é criado mesmo que o usuário não tenha carregado nenhum arquivo ou que o carregamento
tenha falhado. O método hasFile()
retorna verdadeiro se um arquivo tiver sido enviado:
$request->getFile('avatar')->hasFile();
No caso de uma entrada usando notação de array para o nome:
<input type="file" name="my-form[details][avatar]">
árvore devolvida acaba ficando com este aspecto:
[
'my-form' => [
'details' => [
'avatar' => /* FileUpload instance */
],
],
]
Você também pode criar matrizes de arquivos:
<input type="file" name="my-form[details][avatars][] multiple">
Em tal caso, a estrutura parece ser a mesma:
[
'my-form' => [
'details' => [
'avatars' => [
0 => /* FileUpload instance */,
1 => /* FileUpload instance */,
2 => /* FileUpload instance */,
],
],
],
]
A melhor maneira de acessar o índice 1 de uma matriz aninhada é a seguinte:
$file = $request->getFile(['my-form', 'details', 'avatars', 1]);
if ($file instanceof FileUpload) {
// ...
}
Como você não pode confiar nos dados do exterior e, portanto, não confia na forma da estrutura, este método é mais seguro
do que $request->getFiles()['my-form']['details']['avatars'][1]
o que pode falhar.
Visão geral de FileUpload
Métodos
hasFile(): bool
Retorna true
se o usuário tiver feito o upload de um arquivo.
isOk(): bool
Retorna true
se o arquivo foi carregado com sucesso.
getError(): int
Devolve o código de erro associado com o arquivo carregado. É uma das constantes do UPLOAD_ERR_XXX. Se o arquivo foi carregado com sucesso, ele
retorna UPLOAD_ERR_OK
.
move (string $dest)
Move um arquivo carregado para um novo local. Se o arquivo de destino já existir, ele será sobregravado.
$file->move('/path/to/files/name.ext');
getContents(): ?string
Devolve o conteúdo do arquivo carregado. Se o upload não foi bem sucedido, ele retorna null
.
getContentType(): ?string
Detecta o tipo de conteúdo MIME do arquivo carregado com base em sua assinatura. Se o upload não foi bem sucedido ou a
detecção falhou, ele retorna null
.
Requer extensão PHP fileinfo
.
getUntrustedName(): string
Devolve o nome original do arquivo, conforme apresentado pelo navegador.
Não confie no valor retornado por este método. Um cliente pode enviar um nome de arquivo malicioso com a intenção de corromper ou invadir sua aplicação.
getSanitizedName(): string
Devolve o nome do arquivo higienizado. Contém apenas caracteres ASCII [a-zA-Z0-9.-]
. Se o nome não contiver
tais caracteres, ele retorna “desconhecido”. Se o arquivo for JPEG, PNG, GIF, ou imagem WebP, ele retorna a extensão correta
do arquivo.
Requer a extensão PHP fileinfo
.
getSuggestedExtension(): ?string
Retorna a extensão de arquivo apropriada (sem o ponto) correspondente ao tipo MIME detectado.
Requer a extensão PHP fileinfo
.
getUntrustedFullPath(): string
Retorna o caminho completo original, conforme apresentado pelo navegador durante o upload do diretório. O caminho completo só está disponível no PHP 8.1 e superior. Nas versões anteriores, este método retorna o nome do arquivo não confiável.
Não confie no valor retornado por este método. Um cliente pode enviar um nome de arquivo malicioso com a intenção de corromper ou invadir sua aplicação.
getSize(): int
Devolve o tamanho do arquivo carregado. Se o upload não foi bem sucedido, ele retorna 0
.
getTemporaryFile(): string
Retorna o caminho da localização temporária do arquivo carregado. Se o upload não foi bem sucedido, ele retorna
''
.
isImage(): bool
Retorna true
se o arquivo carregado for uma imagem JPEG, PNG, GIF, ou WebP. A detecção é baseada em sua
assinatura. A integridade do arquivo inteiro não é verificada. Você pode descobrir se uma imagem não está corrompida, por
exemplo, ao tentar carregá-la.
Requer extensão PHP fileinfo
.
getImageSize(): ?array
Devolve um par de [width, height]
com as dimensões da imagem carregada. Se o upload não foi bem sucedido ou
não é uma imagem válida, ele retorna null
.
toImage(): Nette\Utils\Image
Carrega uma imagem como um objeto de imagem. Se o upload não foi bem
sucedido ou não é uma imagem válida, ele lança uma exceção Nette\Utils\ImageException
.