Foros del Web » Programando para Internet » PHP »

Urgente problema de seguridad

Estas en el tema de Urgente problema de seguridad en el foro de PHP en Foros del Web. Hola amigos, Tengo un pequeño gran problema, tengo un servidor propio y tengo un script en php que captura las variables que me mandan los ...
  #1 (permalink)  
Antiguo 16/11/2005, 02:51
 
Fecha de Ingreso: abril-2003
Ubicación: Malaga
Mensajes: 176
Antigüedad: 21 años
Puntos: 1
Urgente problema de seguridad

Hola amigos,

Tengo un pequeño gran problema, tengo un servidor propio y tengo un script en php que captura las variables que me mandan los formularios pero por lo que me ha dicho mi administrador no es muy seguro, de hecho creo que ha habido un ataque de spammers.

me gustaria que los mas entendidos en seguridad me ayudasen a mejorar el script y si no es posible mejorarlo pues si me pueden indicar posibles soluciones o sitios donde encontrarlas se los agradeceria mucho

el codigo es el siguiente
Código PHP:
<?

//Seguridad (para q no lo manden desde otros websites)
    //Buscar dominio
echo "REFERER=".$_SERVER['HTTP_REFERER']."<br>";
$ref $_SERVER['HTTP_REFERER'];
$tmp = (substr(stristr($ref'//'),2));
$pos strpos($tmp,'/');
$tmp substr($tmp,0,$pos);
echo 
"TMP=".$tmp."<br>";

//Comparar dominio
if ($tmp!="http://www.dominio.com")
{
    echo 
"PROHIBIDO!!";
    exit;


//Recogida de var's
$recipient $_POST['recipient'];
$subject $_POST['subject'];
$redirect $_POST['redirect'];
$nombre $_POST['nombre'];


// Create the message file based on the posted variables
$msg="============ Envio de Formulario  ============\r\n\r\n";
reset ($HTTP_POST_VARS);
while (list (
$key$val) = each ($HTTP_POST_VARS)) 
{
    if ( (
$key!="recipient") && ($key!="subject")&& ($key!="redirect") )    
    {
        
$msg.= "$key:  $val\r\n";
    }
}


$From="From: $nombre <$email>\n";
   
$mailok=mail("$recipient""$subject"$msg$From); 
if (
$redirect) {
    
header("Location: $redirect");
} else {
    print 
"The data has been submitted. Thank You.";
}
?>
Muchisimas gracias de antemano
  #2 (permalink)  
Antiguo 16/11/2005, 06:58
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Tienes un lio de uso de variables externas .. por un lado usas los arrays superglobales $_POST .. etc y por otro lado usas $HTTP_POST_VARS, deberías usar SÓLO los arrays superglobales $_POST por ejemplo.

Sobre seguriad.

El uso que haces de HTTP_REFERER no es nada confiable, es un dato que se entrega en la conexión entre cliente-servidor .. es fácimelmente alterable el valor o no informado simplemente.

Si lo que quieres evitar es que te usen ese script genérico de envio de e-mails si ese script (de proceso) está en el mismo servidor que tus formularios .. usa sesiones (www.php.net/session) para autentificar que viene de ese formulario concreto.

Un saludo,
  #3 (permalink)  
Antiguo 17/11/2005, 02:42
 
Fecha de Ingreso: abril-2003
Ubicación: Malaga
Mensajes: 176
Antigüedad: 21 años
Puntos: 1
Cita:
Iniciado por Cluster
Tienes un lio de uso de variables externas .. por un lado usas los arrays superglobales $_POST .. etc y por otro lado usas $HTTP_POST_VARS, deberías usar SÓLO los arrays superglobales $_POST por ejemplo.

Sobre seguriad.

El uso que haces de HTTP_REFERER no es nada confiable, es un dato que se entrega en la conexión entre cliente-servidor .. es fácimelmente alterable el valor o no informado simplemente.

Si lo que quieres evitar es que te usen ese script genérico de envio de e-mails si ese script (de proceso) está en el mismo servidor que tus formularios .. usa sesiones (www.php.net/session) para autentificar que viene de ese formulario concreto.

Un saludo,
Estimado Cluster, muchas gracias por tu respuesta, he estado mirando lo que tu me has dicho pero me gustaria que si puedes me seas un poco mas explicito. Supongo que en el form debo crear una sesion y asi comprobarlo por medio del fichero que mande el correo con los datos, no?

Muchas gracias por todo
  #4 (permalink)  
Antiguo 17/11/2005, 05:33
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Si, .. así sería:

formulario.php
Código PHP:
<?
session_Start
();
$_SESSION['control']='da igual el valor';
// tu formulario ...
?>
proceso.php
Código PHP:
<?
session_Start
();
if (!isset(
$_SESSION['control'])){
die (
"Acceso no permitido");
}
// tu actual código de proceso de envio de tu e-mail
?>
Se trata como veras de crear una variable de sesión en tu script de formulario y verificar su existencia (con eso sobra) en el script de proceso. Si la variable de sesión no existe es por qué se accedió directamente a "procesar.php".

En las FAQ's de este foro PHP tienes más información sobre sesiones (que són, teoría y algo de ejemplos básicos).

Un saludo,
  #5 (permalink)  
Antiguo 17/11/2005, 05:56
 
Fecha de Ingreso: abril-2003
Ubicación: Malaga
Mensajes: 176
Antigüedad: 21 años
Puntos: 1
Muchisimas gracias Cluster, una ultima pregunta sobre el tema, tengo varios ficheros que procesan formularios, pero que no es tan generalizado, como ese fichero al que acceden todos los dominios. Supongo, si no es asi me corriges, que corren el mismo riesgo de ser utilizados por spammers, no?

Como veras de seguridad y php estoy algo pegado y por mucho que busco no encuentro muchas paginas que me ayuden. Así que a aprender por medio de prueba/error


Muchas gracias de nuevo.

Un saludo
  #6 (permalink)  
Antiguo 17/11/2005, 09:22
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
tengo varios ficheros que procesan formularios, pero que no es tan generalizado, como ese fichero al que acceden todos los dominios.
Observación: el uso de sesiones de esta forma -sólo- sirve para llamadas de scripts en el mismo dominio de los que deben cumplir cierta secuencia (pasar por "A".php para llegar a "B".php ..)

Cita:
Supongo, si no es asi me corriges, que corren el mismo riesgo de ser utilizados por spammers, no?
Si, .. todo script queda expuesto a una "inyección" directa de datos externos o simple ejecución .. cuando tal vez NO corresponda ejecutar por separado ese script sino como parte de una secuencia de ejecución.

La "sesión" es un concepto (no aplicable sólo a "PHP") se trata de un conjunto de "cosas" que vas a realizar en un tiempo dado y todo según una secuencia dirijida .. Es decir .. por ejemplo, entras por tu script "A.php" .. este hace un proceso y lleva al "B.php" .. este a su vez puede saltar a C.php .. X.php y a su vez algunos de estos pueden ir a A.php .. El caso es que tu vas "validando" a base de ir gestionando tus variables de sesión por donde "vas pasando" y así defines tu proceder (flujo) de tu aplicación cerrando la entrada o acceso donde no corresponda segun tu diseño del flujo de tu aplicación. A todo esto se le suele sumar para comenzar una "autentifiación" de un usuario si corresponde .. pero hay que dejar claro que las "sesiones" no sólo se tratan de "gestionar usuarios y su seguimiento" en una aplicación .. son más útiles de lo que parecen y hay que veras como "unas variables" que son "confiables" .. (para que le empieces a dar usos).

Te recomiendo leer las FAQ's del foro .. comenzando por esta:
http://www.forosdelweb.com/showthrea...936#post238936

Ahí veras una referencia a un artículo sobre seguridad:
http://phpsec.org/projects/guide/

Un saludo,
  #7 (permalink)  
Antiguo 22/11/2005, 03:23
 
Fecha de Ingreso: abril-2003
Ubicación: Malaga
Mensajes: 176
Antigüedad: 21 años
Puntos: 1
Muchas gracias de nuevo cluster, una ultima pregunta, me piden controlar la longitud de las cadenas, por lo visto por ahi fue la injeccion de codigo y evidentemente que las cadenas no tengan caracteres invalidos

Para contrololar los caracteres invalidos se que con usar htmlentitles()

En cuanto a la longitud es mejor comprobarlo en el propio formulario? o mejor que compruebe el tamaño en el script de envio?

Muchas Gracias
  #8 (permalink)  
Antiguo 22/11/2005, 05:31
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Revisa este documento al respecto:

Cita:
Seguridad bajo PHP, prevenir SQL injection .. Cross-Site Scripting .. asegurar sesiones .. etc. (gracias a "fullmental")
http://phpsec.org/projects/guide/

(está en las FAQ's .. intenta hecharle un vistazo en general).

Un saludo,
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:40.