[Cheatsheet] de variables inseguras en PHP
Hoy algo de carne, una chuleta sobre las variables superglobales (woh!) no fiables, donde el cliente puede meter mano:
Leyenda:
- [S]: Seguras
- [I]: Inseguras
- [D]: Depende...
$_SERVER:
- PHP_SELF [I]
- argv [I]
- argc [S]
- GATEWAY_INTERFACE [S]
- SERVER_ADDR [S]
- SERVER_NAME [S]
- SERVER_SOFTWARE [S]
- SERVER_PROTOCOL [I]
- REQUEST_METHOD [I]
- REQUEST_TIME [S]
- QUERY_STRING [S]: Sin comprobar
- DOCUMENT_ROOT [S]
- HTTP_ACCEPT [I]
- HTTP_ACCEPT* [I]
- HTTP_CONNECTION [I]
- HTTP_HOST [D]: Inseguro para el host por defecto si hace fallback
- HTTP_REFERER [I]
- HTTP_USER_AGENT [I]
- HTTPS [S]: Sin comprobar
- REMOTE_ADDR [S]
- REMOTE_HOST [D]: Inseguro si el atacante tiene acceso al servidor DNS
- REMOTE_PORT [S]
- SCRIPT_FILENAME [S]
- SERVER_ADMIN [S]
- SERVER_PORT [S]
- SERVER_SIGNATURE [S]
- PATH_TRANSLATED [I]
- SCRIPT_NAME [S]
- REQUEST_URI [S]
- PHP_AUTH_DIGEST [I]
- PHP_AUTH_USER [I]
- PHP_AUTH_PW [I]
- AUTH_TYPE [I]: No he podido comprobarlo
- PATH_INFO [I]
- ORIG_PATH_INFO [I]: No he podido comprobarlo
$_GET / $_POST / $_REQUEST / $_COOKIE / $argv / $_HTTP_RAW_POST_DATA [I]
Pero muy mucho, eh! ( $_GET se pasa por urldecode() antes de llegar al script )
- $argc [S]
$_FILES:
- name [I]
- type [I]
- tmp_name [S]
- error [S]
- size [S]
Como filtrar
- Si es un entero:
$clean = intval($dirty);
- Si es un flotante:
$clean = floatval($dirty);
- Si es una cadena:
-
Antes de meter en la base de datos: mysql-real-escape-string
$clean = mysql_real_escape_string($dirty);
-
Antes de mostrar al usuario: htmlentities
$clean = html_entities($dirty);
Alternativamente se puede utilizar una función que elimine los caracteres peligrosos ( como base64 ), pero hay que recordar que volverán a ser dañinossi se devuelve a la forma original.
Así, una contraseña que se almacene como un hash, una vez se le pasó la función ( y dado que la forma original se descarta ) es fiable.
Lógicamente no es mano de santo, y no es que yo sepa demasiado de PHP, así que cualquier corrección se agradece.