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