php - valor - ¿Qué variables de $_SERVER son seguras?
recibir valor de variable php en text de html (2)
Cualquier variable que un usuario puede controlar, un atacante también puede controlar y, por lo tanto, es una fuente de un ataque. Esto se llama variable "contaminada" y no es seguro.
Al usar $_SERVER
, muchas de las variables se pueden controlar. PHP_SELF
, HTTP_USER_AGENT
, HTTP_X_FORWARDED_FOR
, HTTP_ACCEPT_LANGUAGE
y muchos otros forman parte del encabezado de solicitud HTTP enviado por el cliente.
¿Alguien sabe de una "lista segura" o una lista no contaminada de variables $_SERVER
?
En PHP, cada variable $_SERVER
que comience con HTTP_
puede ser influenciada por el usuario. Por ejemplo, la variable $_SERVER[''HTTP_REINERS'']
se puede contaminar configurando el encabezado HTTP REINERS
a un valor arbitrario en la solicitud HTTP.
No existen valores "seguros" o "inseguros" como tales. Solo hay valores que el servidor controla y valora que el usuario controla y debe saber de dónde proviene el valor y, por lo tanto, si puede confiar en él para un determinado propósito. $_SERVER[''HTTP_FOOBAR'']
por ejemplo, es totalmente seguro para almacenar en una base de datos, pero ciertamente no lo eval
.
Como tal, dividamos esos valores en tres categorías:
Controlado por el servidor
Estas variables son establecidas por 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 el cliente envió, pero solo pueden tomar un número limitado de valores válidos, ya que todos los valores no válidos deben ser rechazados por el servidor web y no deben originar la invocación del script. Por lo tanto, pueden considerarse confiables .
-
''HTTPS''
-
''REQUEST_TIME''
-
''REMOTE_ADDR''
* -
''REMOTE_HOST''
* -
''REMOTE_PORT''
* -
''SERVER_PROTOCOL''
-
''HTTP_HOST''
† -
''SERVER_NAME''
† -
''SCRIPT_FILENAME''
-
''SERVER_PORT''
‡ -
''SCRIPT_NAME''
* Se REMOTE_
valores REMOTE_
serán la dirección válida del cliente, según lo verificado por un protocolo de enlace TCP / IP. Esta es la dirección a la que se enviará la respuesta. REMOTE_HOST
basa en búsquedas DNS inversas y, por lo tanto, puede ser falsificado por ataques DNS contra su servidor (en cuyo caso, de todos modos, usted tiene problemas mayores). Este valor puede ser un proxy, que es una realidad simple del protocolo TCP / IP y no se puede hacer nada al respecto.
† Si su servidor web responde a cualquier solicitud independientemente del encabezado HOST
, esto también debe considerarse inseguro. Vea ¿Qué tan seguro es $ _SERVER ["HTTP_HOST"]? .
También vea 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 completamente arbitrarios controlados por el usuario
Estos valores no se verifican en absoluto y no dependen de ninguna configuración de servidor, sino que son información totalmente arbitraria enviada por el cliente.
-
''argv''
,''argc''
(solo aplicable a la invocación de CLI, generalmente no es 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''REQUEST_URI''
) -
''PHP_SELF''
(puede contener datos''PHP_SELF''
) -
''PATH_TRANSLATED''
- cualquier otro valor
''HTTP_''
§ Puede considerarse confiable siempre que el servidor web permita solo ciertos métodos de solicitud.
"Puede considerarse confiable si la autenticación es manejada por completo por el servidor web.
El superglobal $_SERVER
también incluye varias variables de entorno. Si estos son "seguros" o no dependen de cómo (y dónde) se definen. Pueden ir desde completamente controlados por el servidor hasta completamente controlados por el usuario.