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$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$usuario = 'usuario';
$contraseña = 'contraseña';
 
try {
 
    $gbd = new PDO($dsn, $usuario, $contraseña);
 
} catch (PDOException $e) {
 
    print "¡Error!: " . $e->getMessage() . "<br/>";
}
  
2 - Sentencias preparadas y procedimientos almacenados 
- Inserciones    
Código PHP:
Ver original$sentencia = $gbd->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
 
$sentencia->bindParam(':name', $nombre);
$sentencia->bindParam(':value', $valor);
 
$nombre = 'uno';
$valor = 1;
$sentencia->execute();
  
- Obtencion de datos    
Código PHP:
Ver original$sentencia = $gbd->prepare("SELECT * FROM REGISTRY where name = ?");
 
if ($sentencia->execute(array($_GET['name'])))  {
  while ($fila = $sentencia->fetch()) 
  {
  }
}
  
  
Tambien podemos crear un filtro antes de ejecutar una sentencia   
Código PHP:
Ver originalfunction filter($data,$filter)
{
    switch($filter)
    {
        case 'alpha';
 
        if( ! ctype_alpha($data)) // validar caracteres alfabeticos solamente  [A-Za-z]         {
            exit('el valor contiene caracteres ilegales');         }
 
        return true;
 
        break;
 
        case 'alnum';
 
        if( ! ctype_alnum($data)) // validar caracteres alfanumericos solamente  [A-Za-z0-9]         {
            exit('el valor contiene caracteres ilegales');         }
 
        return true;
 
        break;
 
        case 'digit';
 
        if( ! ctype_digit($data)) // validar caracteres numericos solamente  [0-9]         {
            exit('el valor contiene caracteres ilegales');         }
 
        return true;
 
        break;
 
        // asi podriamos crear muchos mas filtros, para correos etc..........
        // los mensajes de error se pueden personalizar o hacer cualquier otra cosa como mandarle a otra pagina funcion etc... tan solo es un ejemplo
 
    }
 
}
  
  
// unimos todo lo mencionado y obtenemos lo siguiente    
Código PHP:
Ver original$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$usuario = 'usuario';
$contraseña = 'contraseña';
 
try {
 
    $gbd = new PDO($dsn, $usuario, $contraseña);
 
} catch (PDOException $e) {
 
    print "¡Error!: " . $e->getMessage() . "<br/>";
}
 
    // insercion
 
    $sentencia = $gbd->prepare(" INSERT INTO REGISTRY (nombre, edad) VALUES (:nombre, :edad)");
 
    $sentencia->bindParam(':nombre', $nombre);
 
    $sentencia->bindParam(':edad', $edad);
 
        $nombre = 'uno';
        $edad = 1;
 
        $sentencia->execute(); // ejecutamos la sentencia
 
 
        // obtencion de datos
 
        $sentencia = $gbd->prepare(" SELECT * FROM REGISTRY where nombre = ? ");
 
        $name = filter($_GET['nombre'],'alpha'); // verificacion del filtro
 
        if ($sentencia->execute($name)))
        {
            while($fila = $sentencia->fetch()) 
            {
            }
        }
 
    $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