Foros del Web » Programando para Internet » PHP »

PDO y la seguridad

Estas en el tema de PDO y la seguridad en el foro de PHP en Foros del Web. Estoy tratando de agregar un poco de seguridad en las consultas a la base de datos y tambien a la coneccion. Estoy usando PDO que ...
  #1 (permalink)  
Antiguo 17/10/2013, 15:36
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Exclamación PDO y la seguridad

Estoy tratando de agregar un poco de seguridad en las consultas a la base de datos y tambien a la coneccion.

Estoy usando PDO que fue lo que me han recomendado usuario de este foro. Es por eso que comparto lo que hice y saber si me pueden ayudar con la funcion "prepare".

Gracias

Código PHP:
try {
    
$con = new PDO('mysql:host=localhost;dbname=nombre','root','lapass');
    }
catch (
PDOException $e){
    echo 
"Failed to get DB handle: ".$e->getMessage()."";
    exit;
}

$sql "SELECT * FROM usuarios";
foreach (
$con->query($sql) as $fila) { 
Código HTML:
<?=$fila['nombre'];?><br /> 
Código PHP:

__________________
Zreep
  #2 (permalink)  
Antiguo 17/10/2013, 16:24
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: PDO y la seguridad

Pues no se ve por ningún lado que utilices el método prepare(), ¿o a qué te refieres? ¿el manual no es lo suficientemente claro?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 17/10/2013, 16:50
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: PDO y la seguridad

Ah, ya entendi... me daba error porque el objeto $con no estaba definido. Pero esto es mas seguro? Me gustaria saber tu opinion!

Gracias


Código PHP:
try {
    $con = new PDO('mysql:host=localhost;dbname=nombre','root','lapass');
    }
catch (PDOException $e){
    echo "Failed to get DB handle: ".$e->getMessage()."";
    exit;
}

$sql = "SELECT * FROM usuarios";
$con->prepare($sql);
foreach ($con->query($sql) as $fila) {

<?=$fila['nombre'];?><br />

}
__________________
Zreep
  #4 (permalink)  
Antiguo 17/10/2013, 16:54
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: PDO y la seguridad

¿Seguro en qué sentido?

A simple vista la consulta es inofensiva, y usar prepare() la deja exactamente igual.

Sería grave si haces esto:
Código PHP:
Ver original
  1. $sql = "SELECT * FROM usuarios WHERE id =" . $_GET['id'];

Independientemente de si usas PDO o no, eso es grave.

No entiendo cual es tu duda entonces.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 17/10/2013, 17:01
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: PDO y la seguridad

Disculpa si no me exprese bien, lei PDO y estoy cambiando parte del codigo antes de subirlo a la web, lo que queria saber que tan seguro es y como puedo manegar el tema se seguridad?
__________________
Zreep
  #6 (permalink)  
Antiguo 17/10/2013, 17:07
Avatar de xSkArx  
Fecha de Ingreso: marzo-2008
Ubicación: Chile
Mensajes: 945
Antigüedad: 16 años, 2 meses
Puntos: 96
Respuesta: PDO y la seguridad

Puedes usar consultas parametrizadas
__________________
Busca, lee y practica todo lo que puedas.
Usa siempre el buscador antes de postear.
Si posteas código, utiliza el HIGHLIGHT correcto.
  #7 (permalink)  
Antiguo 17/10/2013, 17:18
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: PDO y la seguridad

Y las declaraciones preparadas reemplasan a mysqli_real_escape_string?
__________________
Zreep
  #8 (permalink)  
Antiguo 17/10/2013, 17:31
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: PDO y la seguridad

Cita:
Iniciado por zreep Ver Mensaje
Y las declaraciones preparadas reemplasan a mysqli_real_escape_string?
Así es, eso lo puedes consultar en el manual.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 17/10/2013, 17:55
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: PDO y la seguridad

La verdad que esto se pone interesante... Ahora voy a pregunta algo que no lo vi en el ejemplo.

antes, (je), estaba la consulta y pasaba esto:

Código PHP:
$sql  "SELECT * FROM tabla WHERE pepe='1'";
res  mysqli_query($enlace,$sql) or die(mysqli_error($enlace));
$fila mysqli_fetch_array($res); 
pero ahora no se que hago mal

Código PHP:
$pass $_POST['user'];
$sql  sprintf("SELECT * FROM tabla WHERE pass='%s';",$pass);
$con->prepare($sql);
$fila.... 
y $fila es igual que? no lo puedo resolver...
__________________
Zreep
  #10 (permalink)  
Antiguo 17/10/2013, 17:59
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: PDO y la seguridad

Espera, esta linea de entrada está mal:
Código PHP:
Ver original
  1. $sql  = sprintf("SELECT * FROM tabla WHERE pass='%s';",$pass)

¿De qué sirve usar consultas preparadas si sigues pasando variables sin escapar?

Eso está mal, por favor revisa el manual del método prepare()
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 17/10/2013, 18:04
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: PDO y la seguridad

Código PHP:
$sql  "SELECT * FROM usuarios WHERE pass='".$_POST['user']."'";
$con->prepare($sql); 
Lo arregle... y el $fila o $row....?
__________________
Zreep
  #12 (permalink)  
Antiguo 17/10/2013, 18:10
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: PDO y la seguridad

Sigues sin entender.

El objetivo del método prepare() no es escapar toda la consulta, es preparar la consulta (de ahí el nombre) para insertar los valores a tiempo, y así se escapan automáticamente.

Del modo en que lo haces simplemente estás desperdiciando dicho uso, y por ende sigues teniendo fallas de seguridad.

¿Por qué no lees el manual?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #13 (permalink)  
Antiguo 17/10/2013, 18:27
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: PDO y la seguridad

Revisa: http://www.forosdelweb.com/f18/aport...8/#post4265377

La parte final de ese mensaje contiene ejemplos de PDO.
__________________
- León, Guanajuato
- GV-Foto
  #14 (permalink)  
Antiguo 17/10/2013, 19:26
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: PDO y la seguridad

Este manual muestra como lo hacías con mysql_* y como sería con PDO:

PDO Tutorial for MySQL Developers
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #15 (permalink)  
Antiguo 17/10/2013, 19:35
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: PDO y la seguridad

conn.php
Código PHP:
try {
    
$con = new PDO('mysql:host=localhost;dbname=base','root','passs');
    }
catch (
PDOException $e){
    echo 
"Failed to get DB handle: ".$e->getMessage()."";
    exit;

index.php
Código PHP:
session_start();
if(isset(
$_POST['enviar'])){
    if(!empty(
$_POST['user'])){       
        
$sql  "SELECT * FROM usuario WHERE pass='".$_POST['user']."'";
        foreach (
$con->query($sql) as $fila){
            if(
$fila 0)
            {
             
$_SESSION['logueado'] = "SI";
             
$_SESSION['usuario']  = $fila['nombre'];
            } else 
            {
             echo 
"<b style='color: red;'>Usuario incorrecto</b>";
            }
        }
    }

Gracias andresdzphp y pateketrueke, ya llegue a un punto en el cual estoy muy mareado. Ya nose que entiendo y que no... aca hice el codido y se que el foreach esta mal... pero la verdad ya nose lo que hice. Disculpenme, estoy leyendo lo que me paso Andres y el manual PDO, pero estoy confundido con todo y ya nose como resulver esto. Mi cabeza estallo!
__________________
Zreep
  #16 (permalink)  
Antiguo 17/10/2013, 19:53
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 12 años, 9 meses
Puntos: 793
Respuesta: PDO y la seguridad

Analiza bien este ejemplo:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $stmt = $db->prepare("SELECT * FROM table WHERE id=:id AND name=:name");
  4. $stmt->bindValue(':id', $id, PDO::PARAM_INT);
  5. $stmt->bindValue(':name', $name, PDO::PARAM_STR);
  6. $stmt->execute();
  7. $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
  8.  
  9. foreach ($rows as $row) {
  10.     //...
  11.         //...
  12. }

La idea es que prepares primero la consulta para que evites inyecciones SQL.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #17 (permalink)  
Antiguo 18/10/2013, 15:28
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: PDO y la seguridad

Bueno gracias a todos, andresdzphp, Triby, pateketrueke por ayudar a este cabeza dura...

Por ultimo le muestro como me quedo el code:

Código PHP:
try {
    
$con = new PDO('mysql:host=localhost;dbname=base','root','pas');
    }
catch (
PDOException $e){
    echo 
"Failed to get DB handle: ".$e->getMessage()."";
    exit;

Código PHP:
session_start();

if(isset(
$_POST['enviar'])){
    if(!empty(
$_POST['user'])){
       
$stmt $con->prepare("SELECT * FROM usuario WHERE pass='".$_POST['user']."'");
       
$stmt->execute();
       
$fila $stmt->fetch();       
            if(
$fila 0){
             
$_SESSION['logueado'] = "SI";
             
$_SESSION['usuario']  = $fila['nombre'];
            } else {
                echo 
"<span style='color: red;'>Usuario incorrecto</span>";
            }
    }

Por otro lado no use "bindValue" por ahora, por que no lei eso.

Gracias nuevamente por todo.
__________________
Zreep
  #18 (permalink)  
Antiguo 18/10/2013, 15:37
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: PDO y la seguridad

Pero lo sigues haciendo mal, ¿qué parte no entiendes?

Código PHP:
Ver original
  1. // MAL
  2. $stmt = $con->prepare("SELECT * FROM usuario WHERE pass='".$_POST['user']."'");
  3.  
  4. // BIEN
  5. $stmt = $con->prepare("SELECT * FROM usuario WHERE pass=:pass");
  6. $stmt->execute(array(':pass => $_POST['user']));

Si no lo haces de esa manera tus consultas seguirán siendo vulnerables, y entonces usar PDO sería una completa pérdida de tiempo y recursos.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #19 (permalink)  
Antiguo 18/10/2013, 15:58
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: PDO y la seguridad

aaaaaaaaaaaaaaah, que boludo soy... y si me dices los mismo tienes razon, no me voy ofender.

Lo veo que parece facil, pero me esta constando mucho...

Código PHP:
session_start();

if(isset(
$_POST['enviar'])){
    if(!empty(
$_POST['user'])){
       
$stmt $con->prepare("SELECT * FROM usuario WHERE pass=:pass");
       
$stmt->execute(array(':pass'=>$_POST['user']));
       
$fila $stmt->fetch();       
            if(
$fila 0){
             
$_SESSION['logueado'] = "SI";
             
$_SESSION['usuario']  = $fila['nombre'];
            } else {
                echo 
"<div style='color: red; text-align: center;'>Usuario incorrecto</div>";
            }
    }

Asi?
__________________
Zreep

Etiquetas: pdo, seguridad, select, sql, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:16.