Ver Mensaje Individual
  #58 (permalink)  
Antiguo 16/06/2013, 13:20
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: seguridad web

CAPITULO 9

EVITAR INYECCION SQL MEDIANTE PDO

En este capitulo trataremos de evitar la inyeccion en nuestra base de datos, es tan solo un ejemplo basico (se deberia de mejorar) que espero sirva como guia.

!!! RECUERDEN !!!

mysql esta deprecado no deberia usarse en nuevos proyectos en su lugar PDO o mysqli, en proyectos que ya usaban mysql deberian de migrar.

Aqui dejo links de ayuda

PDO
http://es1.php.net/manual/es/book.pdo.php

CONEXION
http://es1.php.net/manual/es/pdo.connections.php

TRANSACIONES Y AUTO-COMMIT (no se habla en este capitulo de este tema)
http://es1.php.net/manual/es/pdo.transactions.php

SENTENCIAS PREPARADAS Y PROCEDIMIENTOS ALMACENADOS
http://es1.php.net/manual/es/pdo.pre...statements.php

ERRORES
http://es1.php.net/manual/es/pdo.error-handling.php


1 - Conexion

- La conexion se establece creando instancias de la clase PDO, no importa el controlador que se utilice, siempre se usara el nombre de la clase PDO.

- Si la aplicación no captura la excepción lanzada por el constructor de PDO, la acción predeterminada que toma el motor zend es la de finalizar el script y mostrar información de rastreo.
Esta información probablemente revelará todos los detalles de la conexión a la base de datos, incluyendo el nombre de usuario y la contraseña.
Es sumamente importante capturar esta excepción, ya sea explícitamente (con una sentencia catch) o implícitamente por medio de set_exception_handler().

Código PHP:
Ver original
  1. $dsn = 'mysql:dbname=testdb;host=127.0.0.1';
  2. $usuario = 'usuario';
  3. $contraseña = 'contraseña';
  4.  
  5. try {
  6.  
  7.     $gbd = new PDO($dsn, $usuario, $contraseña);
  8.  
  9. } catch (PDOException $e) {
  10.  
  11.     print "¡Error!: " . $e->getMessage() . "<br/>";
  12.     die();
  13. }

2 - Sentencias preparadas y procedimientos almacenados

- Inserciones

Código PHP:
Ver original
  1. $sentencia = $gbd->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
  2.  
  3. $sentencia->bindParam(':name', $nombre);
  4. $sentencia->bindParam(':value', $valor);
  5.  
  6. $nombre = 'uno';
  7. $valor = 1;
  8. $sentencia->execute();

- Obtencion de datos

Código PHP:
Ver original
  1. $sentencia = $gbd->prepare("SELECT * FROM REGISTRY where name = ?");
  2.  
  3. if ($sentencia->execute(array($_GET['name'])))
  4. {
  5.   while ($fila = $sentencia->fetch())
  6.   {
  7.     print_r($fila);
  8.   }
  9. }


Tambien podemos crear un filtro antes de ejecutar una sentencia
Código PHP:
Ver original
  1. function filter($data,$filter)
  2. {
  3.     switch($filter)
  4.     {
  5.         case 'alpha';
  6.  
  7.         if( ! ctype_alpha($data)) // validar caracteres alfabeticos solamente  [A-Za-z]
  8.         {
  9.             exit('el valor contiene caracteres ilegales');
  10.         }
  11.  
  12.         return true;
  13.  
  14.         break;
  15.  
  16.         case 'alnum';
  17.  
  18.         if( ! ctype_alnum($data)) // validar caracteres alfanumericos solamente  [A-Za-z0-9]
  19.         {
  20.             exit('el valor contiene caracteres ilegales');
  21.         }
  22.  
  23.         return true;
  24.  
  25.         break;
  26.  
  27.         case 'digit';
  28.  
  29.         if( ! ctype_digit($data)) // validar caracteres numericos solamente  [0-9]
  30.         {
  31.             exit('el valor contiene caracteres ilegales');
  32.         }
  33.  
  34.         return true;
  35.  
  36.         break;
  37.  
  38.         // asi podriamos crear muchos mas filtros, para correos etc..........
  39.         // los mensajes de error se pueden personalizar o hacer cualquier otra cosa como mandarle a otra pagina funcion etc... tan solo es un ejemplo
  40.  
  41.     }
  42.  
  43. }


// unimos todo lo mencionado y obtenemos lo siguiente

Código PHP:
Ver original
  1. $dsn = 'mysql:dbname=testdb;host=127.0.0.1';
  2. $usuario = 'usuario';
  3. $contraseña = 'contraseña';
  4.  
  5. try {
  6.  
  7.     $gbd = new PDO($dsn, $usuario, $contraseña);
  8.  
  9. } catch (PDOException $e) {
  10.  
  11.     print "¡Error!: " . $e->getMessage() . "<br/>";
  12.     die();
  13. }
  14.  
  15.     // insercion
  16.  
  17.     $sentencia = $gbd->prepare(" INSERT INTO REGISTRY (nombre, edad) VALUES (:nombre, :edad)");
  18.  
  19.     $sentencia->bindParam(':nombre', $nombre);
  20.  
  21.     $sentencia->bindParam(':edad', $edad);
  22.  
  23.         $nombre = 'uno';
  24.         $edad = 1;
  25.  
  26.         $sentencia->execute(); // ejecutamos la sentencia
  27.  
  28.  
  29.         // obtencion de datos
  30.  
  31.         $sentencia = $gbd->prepare(" SELECT * FROM REGISTRY where nombre = ? ");
  32.  
  33.         $name = filter($_GET['nombre'],'alpha'); // verificacion del filtro
  34.  
  35.         if ($sentencia->execute($name)))
  36.         {
  37.             while($fila = $sentencia->fetch())
  38.             {
  39.                 print_r($fila);
  40.             }
  41.         }
  42.  
  43.     $gbd = null; // cerramos la conexion


Eso es todo sobre el capitulo 9 , si sabes otras maneras o mejorar lo expuesto o solo deseas mostrar tu opinion por favor exponlo.


Saludos nos vemos nuevamente con el capitulo 10.

1 - proteger directorios :link http://www.forosdelweb.com/f18/segur...ml#post4410846
2 - mensajes de error : link http://www.forosdelweb.com/f18/segur...ml#post4412140
3 - archivo de configuracion : link http://www.forosdelweb.com/f18/segur...ml#post4412159
4 - permisos y roles : link http://www.forosdelweb.com/f18/segur...ml#post4412275
5 - verificacion de archivos : link http://www.forosdelweb.com/f18/segur...ml#post4412596
6 - configuracion de sessiones : link http://www.forosdelweb.com/f18/segur...ml#post4416219
7 - session hijacking : link http://www.forosdelweb.com/f18/segur...ml#post4419281
8 - hash de contraseñas : link http://www.forosdelweb.com/f18/segur...ml#post4421471

Última edición por webankenovi; 16/06/2013 a las 13:25