Formularios en PHP

De MediaWiki
Ir a la navegación Ir a la búsqueda

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.

Referencias

Exercicios

Validación de formularios

Subida de ficheiros