Foros del Web » Programando para Internet » PHP »

Seguridad en formulario

Estas en el tema de Seguridad en formulario en el foro de PHP en Foros del Web. Saludos a todos, Hace tiempo hice una pregunta similar, lamentablemente no tuve respuesta. El problema es este: Por segunda ocasión, mi proveedor de hosting me ...
  #1 (permalink)  
Antiguo 15/02/2006, 11:54
 
Fecha de Ingreso: marzo-2003
Mensajes: 29
Antigüedad: 21 años, 9 meses
Puntos: 0
Seguridad en formulario

Saludos a todos,

Hace tiempo hice una pregunta similar, lamentablemente no tuve respuesta. El problema es este: Por segunda ocasión, mi proveedor de hosting me ha enviado un correo alertándome del mal uso de la función mail() de PHP que se encuentra en mis formularios, con la advertencia de que pueden dar de baja mi sitio.

Me han enviado también un ejemplo de código que puede ser incluído en mis formularios para evitar esta situación. La cuestión es que no sé cómo incluirlo (en qué parte) pues mis conocimientos de PHP son poco menos que básicos.

Si alguien pudiera indicarme como incluir ese dichoso código en mi formulario, les estaré eternamente agradecido; a continuación coloco los códigos.

Este es el código del formulario que estoy utilizando:
Código PHP:
<?php
include("global.inc.php");
$errors=0;
$error="Se encontraron los siguientes errores mientras se enviaba la información.<ul>";
pt_register('POST','Email');
pt_register('POST','Nombredelservidorpublico');
pt_register('POST','Apellidodelservidorpublico');
pt_register('POST','Hechosqueconstituyenladenuncia');
$Hechosqueconstituyenladenuncia=preg_replace("/(\015\012)|(\015)|(\012)/","&nbsp;<br />"$Hechosqueconstituyenladenuncia);if($Email=="" || $Nombredelservidorpublico=="" || $Apellidodelservidorpublico=="" || $Hechosqueconstituyenladenuncia=="" ){
$errors=1;
$error.="<li>No llenó uno o más de los espacios requeridos. Por favor regrese e inténtelo de nuevo.";
}
if(!
eregi("^[a-z0-9]+([_\\.-][a-z0-9]+)*" ."@"."([a-z0-9]+([\.-][a-z0-9]+)*)+"."\\.[a-z]{2,}"."$",$Email)){
$error.="<li>Escribió una dirección de correo inválida";
$errors=1;
}
if(
$errors==1) echo $error;
else{
$where_form_is="http".($HTTP_SERVER_VARS["HTTPS"]=="on"?"s":"")."://".$SERVER_NAME.strrev(strstr(strrev($PHP_SELF),"/"));
$message="Nombre completo: ".$Nombrecompleto."
Primer apellido:"
.$Primerapellido."
Segundo apellido:"
.$Segundoapellido."
Calle: "
.$Calle."
Numero:"
.$Numero."
Colonia:"
.$Colonia."
Ciudad:"
.$Ciudad."
Telefono: "
.$Telefono."
Email: "
.$Email."
Nombre del servidor publico: "
.$Nombredelservidorpublico."
Primer apellido del servidor publico: "
.$Apellidodelservidorpublico."
Segundo apellido del servidor publico:"
.$Segundoapellidodelservidor."
Hechos que constituyen la denuncia: "
.$Hechosqueconstituyenladenuncia."
"
;
$message stripslashes($message);
mail("[email protected],","Denuncia de corrupción",$message,"From: phpFormGenerator");

header("Refresh: 0;url=http://www.midominio.com/gracias.htm");
?><?php 
}
?>
El código anterior hace referencia al archivo global.inc.php; este es el código de ese archivo:

Código PHP:
<?php

function pt_register()
{
  
$num_args func_num_args();
   
$vars = array();

   if (
$num_args >= 2) {
       
$method strtoupper(func_get_arg(0));

       if ((
$method != 'SESSION') && ($method != 'GET') && ($method != 'POST') && ($method != 'SERVER') && ($method != 'COOKIE') && ($method != 'ENV')) {
           die(
'The first argument of pt_register must be one of the following: GET, POST, SESSION, SERVER, COOKIE, or ENV');
     }

       
$varname "HTTP_{$method}_VARS";
      global ${
$varname};

       for (
$i 1$i $num_args$i++) {
           
$parameter func_get_arg($i);

           if (isset(${
$varname}[$parameter])) {
               global $
$parameter;
               $
$parameter = ${$varname}[$parameter];
          }

       }

   } else {
       die(
'You must specify at least two arguments');
   }

}

?>
Este es el código que mi proveedor me ha sugerido incluir en mi formulario:

Código PHP:
<?php 
  
function ValidarDatos($campo){
    
//Array con las posibles cabeceras a utilizar por un spammer
    
$badHeads = array("Content-Type:",
                                 
"MIME-Version:",
                                 
"Content-Transfer-Encoding:",
                                 
"Return-path:",
                                 
"Subject:",
                                 
"From:",
                                 
"Envelope-to:",
                                 
"To:",
                                 
"bcc:",
                                 
"cc:");

    
//Comprobamos que entre los datos no se encuentre alguna de
    //las cadenas del array. Si se encuentra alguna cadena se
    //dirige a una página de Forbidden
    
foreach($badHeads as $valor){ 
      if(
strpos(strtolower($campo), strtolower($valor)) !== false){ 
        
header("HTTP/1.0 403 Forbidden"); 
        exit; 
      }
    } 
  }

  
//Ejemplo de llamadas a la funcion
  
ValidarDatos($_POST['email']);
  
ValidarDatos($_POST['asunto']);
  
ValidarDatos($_POST['mensaje']);
?>
Ojalá alguien pueda indicarme cómo debe quedar mi código.

Muchas gracias.
__________________
¿Cómo podrás tú, un hombre común, ajeno a los poderosos caminos de la Fuerza, triunfar por encima de uno de los asesinos más peligrosos de la Galaxia?
  #2 (permalink)  
Antiguo 15/02/2006, 13:09
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 21 años, 1 mes
Puntos: 11
Lo que dicen es que compruebes que los parámetros pasados a la función mail no contengan esos headers. Para ello, inserta la funcion que ellos te dan en tu codigo y luego la llamas antes de llamar la funcion mail, comprobando que los parametros que pasará a ésta estén sin esos headers, te muestran incluso el ejemplo de como hacerlo.

Código PHP:
<?php
  
include("global.inc.php");

  
//colocamos la funcion
  
function ValidarDatos($campo){
    
//Array con las posibles cabeceras a utilizar por un spammer
    
$badHeads = array("Content-Type:",
                                 
"MIME-Version:",
                                 
"Content-Transfer-Encoding:",
                                 
"Return-path:",
                                 
"Subject:",
                                 
"From:",
                                 
"Envelope-to:",
                                 
"To:",
                                 
"bcc:",
                                 
"cc:");

    
//Comprobamos que entre los datos no se encuentre alguna de
    //las cadenas del array. Si se encuentra alguna cadena se
    //dirige a una página de Forbidden
    
foreach($badHeads as $valor){ 
      if(
strpos(strtolower($campo), strtolower($valor)) !== false){ 
        
header("HTTP/1.0 403 Forbidden"); 
        exit; 
      }
    } 
  } 
  
$errors=0;
  
$error="Se encontraron los siguientes errores mientras se enviaba la información.<ul>";
  
pt_register('POST','Email');
  
pt_register('POST','Nombredelservidorpublico');
  
pt_register('POST','Apellidodelservidorpublico');
  
pt_register('POST','Hechosqueconstituyenladenuncia');
    
$Hechosqueconstituyenladenuncia=preg_replace("/(\015\012)|(\015)|(\012)/","&nbsp;<br />"$Hechosqueconstituyenladenuncia);if($Email=="" || $Nombredelservidorpublico=="" || $Apellidodelservidorpublico=="" || $Hechosqueconstituyenladenuncia=="" ){
   
$errors=1;
   
$error.="<li>No llenó uno o más de los espacios requeridos. Por favor regrese e inténtelo de nuevo.";
}
   if(!
eregi("^[a-z0-9]+([_\\.-][a-z0-9]+)*" ."@"."([a-z0-9]+([\.-][a-z0-9]+)*)+"."\\.[a-z]{2,}"."$",$Email)){
   
$error.="<li>Escribió una dirección de correo inválida";
   
$errors=1;
}
   if(
$errors==1) echo $error;
   else{
$where_form_is="http".($HTTP_SERVER_VARS["HTTPS"]=="on"?"s":"")."://".$SERVER_NAME.strrev(strstr(strrev($PHP_SELF),"/"));
$message="Nombre completo: ".$Nombrecompleto."
Primer apellido:"
.$Primerapellido."
Segundo apellido:"
.$Segundoapellido."
Calle: "
.$Calle."
Numero:"
.$Numero."
Colonia:"
.$Colonia."
Ciudad:"
.$Ciudad."
Telefono: "
.$Telefono."
Email: "
.$Email."
Nombre del servidor publico: "
.$Nombredelservidorpublico."
Primer apellido del servidor publico: "
.$Apellidodelservidorpublico."
Segundo apellido del servidor publico:"
.$Segundoapellidodelservidor."
Hechos que constituyen la denuncia: "
.$Hechosqueconstituyenladenuncia."
"
;
   
$message stripslashes($message);

   
//validar datos del mensaje
   
ValidarDatos($mensaje):
   
mail("[email protected],","Denuncia de corrupción",$message,"From: phpFormGenerator");

   
header("Refresh: 0;url=http://www.midominio.com/gracias.htm");
?>
<?php 
}
?>
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 16:50.