Não existem valores "seguros" ou "inseguros" como tais. Existem apenas valores que o servidor controla e valores que o usuário controla e você precisa estar ciente de onde um valor vem e, portanto, se ele pode ser confiável para um determinado propósito. $_SERVER['HTTP_FOOBAR']
por exemplo, é totalmente seguro armazenar em um banco de dados, mas eu certamente não faria eval
isso.
Como tal, vamos dividir esses valores em três categorias:
Controlado por servidor
Essas variáveis são definidas pelo ambiente do servidor e dependem inteiramente da configuração do servidor.
'GATEWAY_INTERFACE'
'SERVER_ADDR'
'SERVER_SOFTWARE'
'DOCUMENT_ROOT'
'SERVER_ADMIN'
'SERVER_SIGNATURE'
Parcialmente controlado pelo servidor
Essas variáveis dependem da solicitação específica enviada pelo cliente, mas só podem assumir um número limitado de valores válidos, uma vez que todos os valores inválidos devem ser rejeitados pelo servidor da web e não causar a invocação do script. Portanto, eles podem ser considerados confiáveis .
'HTTPS'
'REQUEST_TIME'
'REMOTE_ADDR'
*
'REMOTE_HOST'
*
'REMOTE_PORT'
*
'SERVER_PROTOCOL'
'HTTP_HOST'
†
'SERVER_NAME'
†
'SCRIPT_FILENAME'
'SERVER_PORT'
‡
'SCRIPT_NAME'
* Os REMOTE_
valores têm a garantia de ser o endereço válido do cliente, conforme verificado por um handshake TCP / IP. Este é o endereço para onde qualquer resposta será enviada. REMOTE_HOST
depende de pesquisas reversas de DNS e pode, portanto, ser falsificado por ataques DNS contra seu servidor (nesse caso, você terá problemas maiores de qualquer maneira). Este valor pode ser um proxy, que é uma realidade simples do protocolo TCP / IP e nada sobre o qual você possa fazer nada.
† Se o seu servidor web responder a qualquer solicitação, independentemente do HOST
cabeçalho, isso também deve ser considerado inseguro. Veja Quão seguro é $ _SERVER [“HTTP_HOST”]? .
Consulte também http://shiflett.org/blog/2006/mar/server-name-versus-http-host .
‡ Consulte https://bugs.php.net/bug.php?id=64457 , http://httpd.apache.org/docs/current/mod/core.html#usecanonicalphysicalport , http: //httpd.apache. org / docs / 2.4 / mod / core.html # comment_999
Valores totalmente arbitrários controlados pelo usuário
Esses valores não são verificados e não dependem de nenhuma configuração de servidor, são informações totalmente arbitrárias enviadas pelo cliente.
'argv'
, 'argc'
(aplicável apenas à invocação CLI, geralmente não é uma preocupação para servidores da web)
'REQUEST_METHOD'
§
'QUERY_STRING'
'HTTP_ACCEPT'
'HTTP_ACCEPT_CHARSET'
'HTTP_ACCEPT_ENCODING'
'HTTP_ACCEPT_LANGUAGE'
'HTTP_CONNECTION'
'HTTP_REFERER'
'HTTP_USER_AGENT'
'AUTH_TYPE'
‖
'PHP_AUTH_DIGEST'
‖
'PHP_AUTH_USER'
‖
'PHP_AUTH_PW'
‖
'PATH_INFO'
'ORIG_PATH_INFO'
'REQUEST_URI'
(pode conter dados corrompidos)
'PHP_SELF'
(pode conter dados corrompidos)
'PATH_TRANSLATED'
- qualquer outro
'HTTP_'
valor
§ Pode ser considerado confiável , desde que o servidor da web permita apenas determinados métodos de solicitação.
‖ Pode ser considerado confiável se a autenticação for totalmente controlada pelo servidor da web.
A superglobal $_SERVER
também inclui várias variáveis de ambiente. Se eles são "seguros" ou não, depende de como (e onde) são definidos. Eles podem variar de totalmente controlados por servidor a totalmente controlados pelo usuário.