Buscador


En todo Internet
En Uterra.Com

Contenidos


Generalmente los formularios están en una página diferente a la página que los procesa, no tiene el por que ser así, pero es común esta situación, aunque cada día hay más tendencia a procesar el formulario en la misma página en la que se presenta este, no entraremos ahora en el como o por que de esto.

El problema que tiene el procesamiento de un formulario en una página diferente a la que contiene el formulario es que se puede acceder a la página que los procesa, o recargarla y volver a ejecutar la acción que tiene por objetivo.

Intentare ser más concreto con lo que quiero decir. Imaginemos un formulario de contacto, incluso protegido con un captcha para evitar el spam. Dicho formulario esta situado en una página llamada, por ejemplo, “form.php”, y esta página envía los datos a la página de procesamiento, que digamos que se llama “pro_form.php”. Pues bien, la página de procesamiento puede ser vulnerable de dos maneras según tenga o no un antispam captcha instalado.

Si el formulario no tiene instalado un captcha, se puede acceder directamente a la página de procesamiento y enviar tantos mensajes como veces se acceda a esta página, esto lógicamente se puede evitar validando la recepción de datos con PHP.

Si el formulario tiene instalado el captcha, es posible que el usuario introduzca el capcha una vez, y ya ejecutado el primer envío, y en la página de procesamiento, es posible que el usuario mal intencionado ejecute el envío tantas veces como desee con solo recargar la página. Si este es el caso, nos llegaran múltiples envíos a nuestro email todos con la misma información.

Este caso es solo un ejemplo, pero puede darse en muchas de las circunstancias en que operamos con formularios y no deseamos que, o bien se pueda acceder a la página que lo procesa, o bien deseamos evitar que el usuario recargue la página de procesamiento del formulario.

Con este problema en mente me propuse desarrollar un pequeño script que impidiera tanto el acceso directo a la página de procesamiento, como la recarga de la página de procesamiento.

La lógica del procedimiento es muy sencilla, en la página que contiene el formulario creamos una variable con un determinado valor, 1 en nuestro caso, y creamos un sesión con esta variable. La página de procesamiento recogerá esta variable de sesión, y si la variable de sesión existe, ejecuta la acción y además elimina dicha variable de sesión. Si la variable de sesión no existe, nos envía de nuevo al formulario. Por tanto, dado que le formulario crea la sesión, tenemos que acceder al el antes de ejecutar la acción. Si ya hemos accedido a él y la sesión ha sido recibida, se ha ejecutado la acción, pero también la sesión ha sido eliminada, por lo que te enviará al formulario si pretendes recargar la página.

Este enlace te llevará a la página de procesamiento del formulario, es decir, "pro_form.php", verás como te envia directamente a form.php.

Sencillo, ¿verdad?

La sintaxis del formulario y la página de procesamiento es la siguiente:

==================== form.php
<?php  
session_start
(); 
$verifica 1
$_SESSION["verifica"] = $verifica
?> 
<html> 

<head> 
<title>Impedimos que se acceda a la pagina que procesa el formulario o se actualice.</title> 
</head> 

<body> 

<form method="POST" action="pro_form.php"> 
    <p>Nombre: <input type="text" name="nombre" size="20"></p> 
     
    <p>E-mail: <input type="text" name="email" size="20"></p> 
     
    <p><input type="submit" value="Enviar" name="B1"></p> 
</form> 

</body> 

</html> 
==================== pro_form.php
<?php  
session_start
(); 

$verifica $_SESSION["verifica"]; 

$nombre $_POST['nombre']; 
$email $_POST['email']; 


if (
$verifica == 1)  
{  
unset(
$_SESSION['verifica']);  

// Aqui colocamos el codigo que queremos que se ejecute 

echo "<p>Los datos recibidos son:</p> 
Nombre: 
$nombre <br> 
E-mail: 
$email <br>";  

}  
else  
{  
// Si no viene del formulario o trata de recargar pagina los enviamos al formulario 
echo "<META HTTP-EQUIV='Refresh' CONTENT='0; url=form.php'>"
}  

?> 

Código PHP