PHP - Usar PDO MySQL

 
Vista:

Usar PDO MySQL

Publicado por Damian (62 intervenciones) el 10/10/2014 16:53:46
Para evitar inyección de SQL se ve que hay que trabajar con PDO_MySQL. Yo ya tengo todas mis consultas en MySQL pero como voy a hacer algo con usuarios en mi sitio, quiero evitar lo de injection sql. Por eso necesito encontrar algo sobre como comenzar a usar PDO en mis consultas, algun tutorial o si alguien tiene un ejemplo desde el principio para usarlo.
Me doy cuenta que entrando al php.ini (en el xampp de mi PC) esta habilitado el extension=php_pdo_mysql.dll por lo que creo está disponible para su uso; no se si falta algo más. Después lo tendré que verificar también en el servidor.

Bueno, en definitiva, si alguien tiene algo de código sobre PDO me ayudaría mucho. Gracias!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Vainas
Val: 34
Ha aumentado su posición en 3 puestos en PHP (en relación al último mes)
Gráfica de PHP

Usar PDO MySQL

Publicado por Vainas (262 intervenciones) el 10/10/2014 18:34:11
Buenas:

No creas que con usar otra libreria evitas el SQL injection. Tambien puedes usar msqli y seguir alguna reglas para evitarlo. Lo que si esta claro es que si haces consultas en MySQL deberias buscar una libreria lo mas actual. Por el ejemplo la libreria mysql a secas ya esta desfasada y deberias usar mysqli en cambio. Apartir de aqui busca buenas practicas para evitar este tipo de ataques.

Espero que ayude. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Usar PDO MySQL

Publicado por Damian (62 intervenciones) el 10/10/2014 22:59:08
Gracias xve por el link, ya lo estaré revisando.

En cuanto a lo que me dices Vainas, que opción me recomiendas utilizar ¿MySQLi entonces? O de que otra forma puedo hacer la consulta que tengo ahora en MySQL para que sea más segura.

Ahora la tengo así en MySQL por ejemplo:
1
$sql="select CodUser,Usuario,Mail,Pass from usuarios where binary Pass='".$_POST['Pass2']."' and (binary Usuario='".$_POST['Nick2']."' or binary Mail='".$_POST['Nick2']."')";

Quizás hay una mejor, o con MySQLi debería probar. Gracias nuevamente!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Usar PDO MySQL

Publicado por xve (6935 intervenciones) el 11/10/2014 09:43:43
Hola Damian, utilizando correctamente PDO, el ya se encarga de que no haya SQL Injection... te pongo un ejemplo:

1
2
3
4
5
6
$query="INSERT INTO Tabla (id,Nombre,Apellidos) VALUES (?,?,?)";
 
$params=array($_POST["id"], $_POST["Nombre"], $_POST["Apellidos"]);
 
$result_db = $dbh->prepare($query);
$result_db->execute($params);

Fijate, que cuando defines la consulta sql, no pones comillas, ni nada por el estilo... si por ejemplo, en el nombre el usuario pone: Jon's o Jon"s... lo agregara perfectamente a la base de datos, sin tener que hacer absolutamente nada.

Te recomiendo encarecidamente utilizar unos de los dos formatos que permite PDO http://php.net/manual/es/pdo.prepare.php

Espero que te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 729
Bronce
Ha aumentado 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Usar PDO MySQL

Publicado por Gonzalo (615 intervenciones) el 10/10/2014 23:13:20
para evitar un sqlinjection debes entender primero como funciona mysql (o sql en general)

se trata de alterar el query usando los valores escritos en los parametros que pasas al query por ejemplo tienes este query

un usuario escribe su numero de usuario y esta query lo busca

select * from usuarios where idusuario='$idusuario'

suponiendo que buscas al usuario 1 entonces ese query queda como

select * from usuarios where idusuario='1'

pero que pasa si quien escribio el numero de usuario modifica el parametro y escribe: 1'; drop usuarios --

eso modificaria el query y lo dejaria de esta forma

select * from usuarios where idusuario='1'; drop usuarios --'

por la estructura del sql ese query se divide en 2 esto por el ; , asi que el primer query funciona bien y el segundo query tambien, el segundo query es el injection.

lo que debes hacer es validar lo que el usuario escribe y no lo dejes escribir otra cosa que no sean caracteres validos para el id del usuario (1 2 3 4 5 6 7 8 9 0 o solo letras mayusculas y minusculas o ambos cualqier otro caracter que escriba cancela el proceso y nunca llegas al query.

otra cosa es restringir al usuario para que pueda escribir solo la longitud maxima de caracteres admitidos para ese campo, si el id del usuario es de 20 caracteres no le permitas capturar mas de esos caracteres.

detecta palabras como delete drop o caracteres como * = <> ' -

con estas 3 reglas puedes evitar bastante injection pero aun falta mas que hacer ya que no solo por ahi pueden atacar tu pagina, revisa "seguridad php" en youtube o google, vas a encontrar bastante ayuda.

mucha suerte, salu2.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Usar PDO MySQL

Publicado por Damian (62 intervenciones) el 11/10/2014 02:35:46
Vaya que hay cosas que uno puede hacer.
Justo estaba leyendo esto: http://php.net/manual/es/security.database.sql-injection.php y más o menos voy viendo como viene la cosa.

De todas formas no entiendo mucho el ejemplo #5 que ponen:
1
2
3
4
5
6
7
8
<?php
settype($offset, 'integer');
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
 
// Fíjese en %d en el formato de cadena, utilizar %s podría no tener un resultado significativo
$query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",
                 $offset);
?>
¿Supuestamente la primera consulta es más segura?
Igual el mysql_real_escape_string() para escapar caracteres ya no aconsejan usarlo. Bueno, en definitiva, hay mucho por leer y hacer.

De todas formas desde el hosting donde esta alojada mi web me ofrecen certificados de encriptación SSL, ¿con eso se soluciona el tema de las consultas?
Gracias por su ayuda y orientación.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Vainas
Val: 34
Ha aumentado su posición en 3 puestos en PHP (en relación al último mes)
Gráfica de PHP

Usar PDO MySQL

Publicado por Vainas (262 intervenciones) el 11/10/2014 15:23:44
Buenas:

Con certificados SSL lo unico que logras es que la conexion entre el cliente y el servidor sea segura para ataques entre estos dos (en un pase de contraseñas o informacion sensible por ejemplo) hasta donde yo tengo entendido. Normalmente no creo que sea necesario asegurar la conexion entre el servidor php y el servidor de base de datos, eso ya lo suele hacer el propio hosting. Hay algunos en los que conectas a la bbdd por localhost asi que se encuentra en el mismo hosting, lo he probado en hostgator y es de este modo por ejemplo. Otros (como 1and1) deben tener servidores separados pero ya se encargan ellos de asegurar de que ip's vienen las consultas etc etc.

El tema de consultas es complicado, tanto como lo que me preguntas si usar mysqli o pdo. Algunos te diras que pdo por rapidez, que si mysqli tal, etc etc etc. Sigue las indicaciones que te han ido dando y si consigues algo mas compartelo

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar