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 evallo 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_HOSTSin 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 HOSTencabezado, 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 $_SERVERtambié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.