No existen valores "seguros" o "inseguros" como tales. Solo hay valores que controla el servidor y valores que controla el usuario, y debe saber de dónde proviene un valor y, por lo tanto, si se puede confiar en él para un determinado propósito.$_SERVER['HTTP_FOOBAR']
por ejemplo, es completamente seguro almacenarlo en una base de datos, pero ciertamente no eval
lo haría .
Como tal, dividamos esos valores en tres categorías:
Controlado por servidor
Estas variables las establece el entorno del servidor y dependen completamente de la configuración del servidor.
'GATEWAY_INTERFACE'
'SERVER_ADDR'
'SERVER_SOFTWARE'
'DOCUMENT_ROOT'
'SERVER_ADMIN'
'SERVER_SIGNATURE'
Parcialmente controlado por el servidor
Estas variables dependen de la solicitud específica que envió el cliente, pero solo pueden tomar un número limitado de valores válidos, ya que todos los valores inválidos deben ser rechazados por el servidor web y no causar que se inicie la invocación del script. Por tanto, pueden considerarse fiables .
'HTTPS'
'REQUEST_TIME'
'REMOTE_ADDR'
*
'REMOTE_HOST'
*
'REMOTE_PORT'
*
'SERVER_PROTOCOL'
'HTTP_HOST'
†
'SERVER_NAME'
†
'SCRIPT_FILENAME'
'SERVER_PORT'
‡
'SCRIPT_NAME'
* Se REMOTE_
garantiza que los valores son la dirección válida del cliente, como se verifica mediante un protocolo de enlace TCP / IP. Esta es la dirección a la que se enviará cualquier respuesta. REMOTE_HOST
Sin embargo, se basa en búsquedas de DNS inversas y, por lo tanto, puede ser falsificado por ataques de DNS contra su servidor (en cuyo caso, de todos modos, tiene problemas mayores). Este valor puede ser un proxy, que es una simple realidad del protocolo TCP / IP y nada sobre lo que pueda hacer nada.
† Si su servidor web responde a cualquier solicitud independientemente del HOST
encabezado, esto también debe considerarse inseguro. Consulte ¿Qué tan seguro es $ _SERVER [“HTTP_HOST”]? .
Consulte también 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 arbitrarios controlados por el usuario
Estos valores no se comprueban en absoluto y no dependen de ninguna configuración del servidor, son información totalmente arbitraria enviada por el cliente.
'argv'
, 'argc'
(solo se aplica a la invocación de CLI, no suele ser una preocupación para los servidores 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'
(puede contener datos contaminados)
'PHP_SELF'
(puede contener datos contaminados)
'PATH_TRANSLATED'
- cualquier otro
'HTTP_'
valor
§ Puede ser considerado confiable siempre que el servidor web permita solo ciertos métodos de solicitud.
‖ Puede ser considerado confiable si la autenticación es manejada completamente por el servidor web.
La superglobal $_SERVER
también incluye varias variables de entorno. Que sean "seguros" o no dependerá de cómo (y dónde) se definan. Pueden variar desde completamente controlados por el servidor hasta completamente controlados por el usuario.