Ver Mensaje Individual
  #3 (permalink)  
Antiguo 03/02/2004, 10:14
josemi
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Veamos, el que tengan o no el nombre de las variables no influye. Bueno, si influyen. Pero para saberlas, o bien conocen tu codigo, o bien las adivinan al azar.

O la que si es un fallo, que sea tu propio script el que les de el nombre. Eso puede pasar si tienes activado los mensajes de error y llaman a tu script de tal forma que generan un error. Por eso es importante desactivar los mensajes de error en entornos de produccion.

Mas que del nombre de las variables, lo que debes hacer es verificar el origen de los valores y su validez. Para eso es una buena ayuda el register_globals a OFF. De esta forma las variables externas al script solo son accesibles desde los arrays superglobales ($_GET, $_POST, ...). Asi estas seguro que cuando haces:
Código PHP:
echo $variable
$variable es una variable que has creado tu en el script, y no viene de una peticion "adulterada" tipo pagina.php?variable=valor_malo.

Y valida que todos los valores pertenezcan al rango de valores que deseas. Y gestiona los errores que puedan provocar valores que no existen. Por ejemplo, si a tu script lo llamas de la forma pagina.php?id=12, siendo id un numero entero positivo:
Código PHP:
$par_id=$_GET['id'];  // sabemos que id viene por URL. No aceptamos que venga por POST, COOKIE o SESSION
settype($par_id,'integer');  // mira el manual, pero lo que hace es forzar a que $par_id sea un entero
// aqui se supone que $par_id es un entero
// falta ver que sea positivo
if (0>$par_id$par_id=0;  // en este caso 0 es un valor valido. Puede que en tu caso sea el 1 el primer valor valido

// en este punto sabemos que $par_id es un entero positivo o 0
// pero puede que en nuestra tabla no exista un registro con ese id
$SQL="SELECT * FROM tabla WHERE id=$par_id"// podemos usar $par_id sin miedo, sabemos que es un entero positivo
$result=mysql_query($SQL,$link) or error_mysql($SQL,__FILE__,__LINE__,$link);
// para controlar los errores de mysql, usas una funcion que dependiendo de la configuracion muestra el mensaje, lo guarda en un log o no muestra nada
if (0==mysql_num_rows($result)) {
// ahora si mostramos el registro
} else {
// el id no existe, ¿intento de asalto? ¿link erroneo? ¿error al teclear?
// solo tu sabes que hacer en este caso: mostrar un mensaje, almacenar datos, enviarte un email de aviso

Como ves, lo que se puede hacer con un par de lineas, gracias a la "paranoia" de la seguridad el codigo a crecido (este ejemplo tampoco es 100% seguro, lo he escrito de cabeza).

Tambien es conveniente inicializar las variables del script. Prueba este script con register_globals a ON y llamandolo pagina.php?ok=1&pass=hola:
Código PHP:
<?php
if ('clave_secreta'==$_GET['pass']) {
 
$ok=true;
}

if (
$ok) {
  echo 
"mi informacion super secreta";
} else {
  echo 
"no,no, eso no se hace. Kaka";
}
?>
Y ahora este otro parecido, llamandolo igual:
Código PHP:
<?php
$ok
=false;
if (
'clave_secreta'==$_GET['pass']) {
 
$ok=true;
}

if (
$ok) {
  echo 
"mi informacion super secreta";
} else {
  echo 
"no,no, eso no se hace. Kaka";
}
?>
Con una simple inicializacion ya has solucionado el problema (tambien podrias haber puesto un else al primer if). Tambien con esto solucionas el problema de los nombres de variables del script. Como inicializas con un valor, pisas cualquier valor maligno que pueda haber intentado pasar el atacante.

Suerte.

PD: El problema que tienen los prefabricados que dan codigo fuente, es que el atacante tiene conocimiento de toda la estructura de la aplicacion. Y en caso de agujero de seguridad del prefabricado, no hay quien te salve (estate siempre actualizado a la ultima version con los parches de seguridad).

PD2: Por supuesto, esta es mi opinion. No me considero un experto en seguridad (ni ha nivel de configuracion del servidor ni de codigo). Asi que bienvenidas todas las opiniones/experiencias.

PD3: Que alguien tenga mania persecutoria, no quiere decir que no le sigan
__________________
Josemi

Aprendiz de mucho, maestro de poco.

Última edición por josemi; 03/02/2004 a las 10:16