Como proteger los IDs enviados por la URL Mysql y PHP

Nota: tutorial para bases de datos Mysql

Supongamos que en mi sitio Web tengo una sección clásica de artículos en mi sitio Web.  Para poder mostrar el detalle de cada articulo envio un id para especificar al sistema cual es  articulo.php?id_articulo=2, osea que voy a dar lectura en la tabla de la base de datos donde el identificador del articulo es 2. De cierto modo esto es inseguro. Para dar mayor seguridad les mostrare como crear un tipo de hash que tiene ida y vuelta. Por que recordemos que un hash no tiene vuelta.

Supongamos que nuestro código PHP donde mostramos nuestras noticias es el siguiente:
<?php
$q = “SELECT * FROM noticias;
$r = mysql_query($q,$conexion);

while($r = mysql_fetch_array( $r ) ){
?>
<a href=”articulo.php?id_articulo=<?php echo $r[‘id_articulo’]?>”><?php echo $r[‘titulo_articulo’]?></a>
<? }
?>

Ahora para proteger nuestros IDs de articulos necesitaremos una pequeña variable con una clave
$clave = “a12b34dsakcsuklmdsa”;  //Esta puede ser cualquier cosa mientras mas compleja mejor.

Ya teniendo nuestra pequeña clave  nuestro código anterior quedará de la siguiente forma

<?php
$clave“a12b34dsakcsuklmdsa”;
$q = “SELECT * FROM noticias;
$rmysql_query($q,$conexion);

while($r = mysql_fetch_array( $r ) ){
$id_protegidomd5($clave.$rs[id_articulo]);
?>
<a href=”articulo.php?id_articulo=<?php echo $id_protegido; ?>”><?php echo $r[‘titulo_articulo’]?></a>
<? }
?>

El código anterior nos imprimirá un HTML similar al siguiente:

<a href=”articulo.php?id_articulo=2131cg3c4fg31t03erc3brb0474t130>El titulo del articulo</a>

Hasta aca estamos bien. Ahora vamos a modificar nuestra consulta SQL donde mostramos el detalle del articulo.

$clave = “a12b34dsakcsuklmdsa”; //Está variable debe estar accesible en nuestras consultas
$id = $_GET[“id_articulo”];
$sql = “select * from articulos where id_articulo=”.$id;

 

Ahora lo que haremos es tomar la cadena de 32 caracteres  y la  transformaremos del lado de mysql el ID en conjunto con nuestra clave  al momento de filtrar en el WHERE de la consulta

$sql = “select * from articulos where MD5(concat(‘”.$clave.”,id_articulo)) =”.$id ;

Con eso ya resolvemos el problema de mostrar nuestros ids lo que nos da un poco más de seguridad, aun que cabe mencionar que estamos suponiendo que la variable $id ya ha sido filtrada por algun sistema de seguridad para evitar inyecciones SQL.



Anuncios

13 comentarios en “Como proteger los IDs enviados por la URL Mysql y PHP

  1. egaziel dijo:

    Que motor de base de datos usaste y que tipo de base de datos?
    Quice hacer ese pequeño ejemplo pero al hacer la consulta me manda el error de sintaxis, si nos pudieras facilitar esos datos te lo agradeceriamos mucho de antemano.

  2. hola, primeramente decirte que tu sitio muy interesante gracias!.

    Tengo la siguiente consulta:

    $consulta=mysql_query(“SELECT * FROM subcategorias WHERE idsubcategoria = ‘”.$_GET[‘idsubcategoria’].”‘”);
    while($resultado=mysql_fetch_array($consulta))
    {
    echo $resultado[‘nombresubcategoria’];
    }

    Lo único que hace la consulta es mostrar el nombre de la subcategoría elegida.
    Mi pregunta es si debo agregar algún tipo de seguridad en el código?. La carga de las cat y sub categorías las realizo en forma manual desde el phpmyadmin, y en el sitio solo tengo esa consulta. O sea, si me inyectan algo en la url del get que le podría pasar al sitio si solo lo uso para mostrar?.
    aunque el insert, delete y el update lo trabaje directamente desde el phpmyadmin pueden modificarme el contenido de la base de datos?. Cómo debería proteger el contenido del $_GET?, con mysql_real_escape_string() por ejemplo andaría bien?.

    GRacias por darme un ejemplo!. Salduos!

    • Hola buenos dias.

      Te recomiendo que para proteger las consultas donde el filtro sea recibido por la URL ( osea tipo $_GET ) utilices ciertas funciones para protegerlas.

      Por ejemplo: Si vas pasar a pasar el ID por la url utiliza la función intval()
      ejemplo:
      SELECT * FROM subcategorias WHERE idsubcategoria = ‘”.intval($_GET[‘idsubcategoria’]).”‘
      La cual convertirá toda cadena en un entero. Si llega algo asi como noticias.php?id=micodigo_malicioso
      del lado del PHP será id=0;
      Igual si quieres proteger mas tus id que envias por la url checate este otro post que tengo .

      Otra función para evitar inyecciones sql es la de mysql_escape_string() la cual podrás utilizar cuando trabajes con cadenas.
      por ejemplo
      “SELECT * FROM usuarios WHERE nombre ='”.mysql_escape_strings($_post[“nombre”]).”‘”;

      Saludos. Si tienes otra duda envíame un mensaje, estamos para apoyarnos

  3. Muchas gracias daronwolff!.

    Ahora te consulto que difertencia hay con usar mysql_real_escape_string() y mysql_escape_string()?.

    En tu ejemplo agregaste para $_POST, pero sirve también para $_GET?.

    Muchas gracias nuevamente!.

  4. Jose Luis dijo:

    Hola quise aplicar tu codigo con mysqli pero manda error:
    te mando la impresion de la sentencia sql generado pero no muestra los datos
    select * from tconfiguracion where MD5(concat(‘a12b34dsakcsuklmdsa’,id_articulo))=99552b6d99eab35e8efe576241d14a4b

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s