Jump to content
pintix

Clase para comprobar los datos de un GET en PHP

Recommended Posts

He creado una clase en PHP para comprobar que los pares de clave y valor de un GET a los que enlazamos en un una página no han sido modificados por el usuario en la barra de direcciones del navegador. La pongo en este tema por si a alguien le puede resultar de utilidad.

 

Es un ejemplo que se debe modificar para que tenga un uso práctico ya que lo único que hace por ahora es comprobar si se han modificado, o no, los datos. Espero que con la documentación que tiene se entienda su uso. Como podreis ver en los comentarios del código una de las primeras cosas que habría que hacer es cambiar la contraseña que usa para las comprobaciones.

 

La utilidad que yo le he encontrado es la de que los usuarios no accedan a datos a los que no está previsto que lo hagan, por ejemplo los resultados correctos de un cuestionario. Creo que también se puede usar para mejorar la seguridad de un sitio web, ya que comprueba la integridad de los datos enviados sin utilizar ni sesiones, ni conexiones a bases de datos, pero no pondría la mano en el fuego de que sea el 100% seguro, ya que no soy experto en el tema.

 

La clase iría en el archivo seguridadpareshash.php

 

<?php
/** 
*  Seguridad GET con un hash MD5
*	
*  Comprueba en el script de destino que los datos de un query al que enlaza nuestra pagina 
*  son los originales
*	
*  Puede ser útil, por ejemplo, cuando queremos dar listas con soluciones a ejercicios 
*  a medida que avanza un curso. Con unos pares solucion / tema para que si una combinacion
*  de número de solucion y tema no esta en lista de la pagina no pueda ser visto por el 
*  usuario utilizando la barra de direcciones
*/

class CompruebaGetEntrePaginas
{	
private $palabraSecreta;
private $GETconHash = '';

// Genera un GET con un codigo de comprobacion al final
public function GeneraGETconHash ($ArrayVariables)
{		
	$Liga = "";
	foreach ($ArrayVariables as $UnaLlave => $UnValor){
		$GETconHash .= $Liga.$UnaLlave."=".$UnValor;
		$Liga = "&";
	}
	$GETconHash = "?".$GETconHash;
	$palabraSecreta = $this->GeneraPalabraSecreta ();
	$ArrayVariables["palabraSecreta"] = $palabraSecreta;
	$ClaveHash = hash ("md5",serialize($ArrayVariables));
	$GETconHash .= $Liga."ps=".$ClaveHash;
	return $GETconHash;
}

// Genera una URL completa, simplemente sirve para que haya menos funciones en la creación de la lista 
public function GeneraURL ($ElArrayVariables,$CadenaScript = "")
{		
	$elGETconHash = $this->GeneraGETconHash ($ElArrayVariables);
	$PrefijoURL = (empty($CadenaScript))? $_SERVER["PHP_SELF"] : $CadenaScript;
	$URLcompleta = $PrefijoURL.$elGETconHash; 
	return $URLcompleta;
}

// Comprueba que no se ha modificado la URL
public function CompruebaGETconHash ()
{
	$ArrayTrabajo = $_GET;
	$ValorHash = array_pop ($ArrayTrabajo);
	$palabraSecreta = $this->GeneraPalabraSecreta ();
	$ArrayTrabajo["palabraSecreta"] = $palabraSecreta;
	$ValorEsperadoHash = hash ("md5",serialize($ArrayTrabajo));
	$comparacionValores = ($ValorHash == $ValorEsperadoHash)? TRUE : FALSE;
	return $comparacionValores;
}

// Para mas seguridad se deberia reescribir esta funcion para leer el valor de una base de datos
private function GeneraPalabraSecreta ()
{
	return 'flghusf';
}
}
?>

 

Un ejemplo de lista (con un solo elemento, que para probar ya es suficiente ;) )

 

<?php
include_once ("seguridadpareshash.php");

// Iniciamos la clase de creacion/comprobacion
$CreaCompruebaURL = new CompruebaGetEntrePaginas ();

// En esta variable ponemos el nombre del script PHP. Si esta vacio
// o no esta definido se usa $_SERVER["PHP_SELF"]
$NombreScriptDestino = "resultadosprueba.php";

// En este array asociativo ponemos los pares de datos que iran en el GET
$DatosGet = Array("solucion" => "12","tema" => "25");

// Aqui creamos el URL. La variable $NombreScriptDestino es opcional
$nuevaURL = $CreaCompruebaURL->GeneraURL ($DatosGet,$NombreScriptDestino);

// Mostramos el resultado en pantalla
print ('<a href="'.$nuevaURL.'">Resultados al ejercicio 12 del tema 25</a>');
?>

 

Comprobación de los resultados en resultadosprueba.php

 

<?php
include_once ("seguridadpareshash.php");

$CreaCompruebaURL = new CompruebaGetEntrePaginas ();

// Comprobamos que coincide elcontenido de las variables de GET con el hash MD5 final
if ($CreaCompruebaURL->CompruebaGETconHash ()){
echo "Datos URL originales";
} else {
echo "Datos URL modificados";
}
?>

 

Podeis ametrallarme a preguntas para cualquier cosa que no se entienda. También se aceptan aportaciones al código.

 

compruebagethash.zip

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.