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.