Formularios en PHP
Sumario
Validación de formularios
É recomendable facer validacións no lado do cliente e do servidor. No lado cliente, evitamos o tránsito de datos e procesamento innecesario do servidor; pero como non podemos garantir o seu uso (javascript pode estar deshabilitado no navegador, e non todos os navegadores soportan todas as características de HTML5) cómpre igualmente facer validacións no lado do servidor.
Algúns enlaces sobre validación do lado do cliente:
En JavaScript (Constraint Validation API):
En HTML5:
A continuación, centrarémonos na validación no lado do servidor en PHP.
Filtros
Podes validar campos dos formularios co uso de filtros. Podes ver exemplos básicos e avanzados en w3schools
Por exemplo, para comprobar se unha variable idade é un número entre 0 e 150:
<?php
$idade = 65;
$min = 0;
$max = 150;
if (filter_var($idade, FILTER_VALIDATE_INT, array("options" => array("min_range"=>$min, "max_range"=>$max))) === false) {
echo("Idade non é un valor axeitado no rango");
} else {
echo("Idade é un valor do rango");
}
?>
Expresións regulares
Tamén hai exemplos de formularios con campos validados con expresións regulares.
Funcións para sanear as cadeas
As funcións trim,stripslashes w htmlspecialchars permiten validar cada variable $_POST evitando posibles ataques.
Posible exemplo e explicación:
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
Evitando XSS (Cross site scripting) asegurando o uso de PHP_SELF
Pódese evitar ataques XSS usando igualmente htmlspecialchars:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
Podes atopar a explicación detallada de w3schools en PHP, outros recursos, ler este manual do IES San Clemente e averiguar máis do XSS na páxina da OWASP[1],[2] e [3].
Envío de ficheiros ao servidor
Utilizando scripts PHP é posible permitir que os formularios postos a disposición dos usuarios envíen non só información textual senón tamén ficheiros binarios, e dicir, ficheiros que se enviarán literalmente, sen ningún tipo de transformación.
A etiqueta de HTML <input type="file" ... > fai que o navegador amose un botón que dará acceso a un selector de ficheiros que permitirá percorrer os medios de almacenamento dispoñibles. O ficheiro seleccionado será enviado xunto co resto dos datos sempre que na etiqueta do formulario se inclúa <form enctype="multipart/form-data" ... > para indicar que é preciso non facer ningunha transformación nos datos que se envían, porque iso podería supoñer que o ficheiro, unha vez chegado ao servidor, non fose utilizable. Por exemplo:
<form action="recibir" method="post" enctype="multipart/form-data">
Texto: <input type="text" name="texto"><br>
Ficheiro: <input type="file" name="ficheiro"><br>
<input type="submit" value="Enviar">
</form>
Neste caso o formulario HTML permitirá enviar un ficheiro acompañado dun texto. Só falta que o servidor estea preparado para recibilo cando se dispoña a contestar á URL recibir.
$txt = $_POST['texto'];
$ruta = 'ficheiros/' . $_FILES['ficheiro']['name'];
$temp = $_FILES['ficheiro']['tmp_name'];
if (move_uploaded_file($temp, $ruta)) {
plantilla('O proceso de gardado do ficheiro acabou correctamente');
$consulta = "INSERT INTO fotos VALUES (NULL, '$txt', '$ruta')";
$conexion = mysqli_connect('localhost','root','','base');
$resultado = mysqli_query($conexion, $consulta);
} else {
plantilla('Non foi posible gardar o ficheiro');
}
No servidor, o script correspondente deberá decidir cal é a ruta na que se almacena o ficheiro recibido, que de momento está nun destino provisional. Antes de facer este paso sería posible establecer comprobacións como se usuario está identificado, ou cal é o tamaño ou tipo do ficheiro e non copialo se non cumpre as restricións que queiramos establecer.