2012-05-06 10 views
6

Solo necesito asegurarme de que tengo las declaraciones de preparación de PDO correctamente, ¿será seguro el siguiente código con SQL Injection?Declaración preparada por PDO, ¿utilizada correctamente?

$data['username'] = $username; 
$data['password'] = $password; 
$data['salt'] = $this->generate_salt(); 
$data['email'] = $email; 

$sth = $this->db->prepare("INSERT INTO `user` (username, password, salt, email, created) VALUES (:username, :password, :salt, :email, NOW())"); 
$sth->execute($data); 
+4

Parece correcto. Estás protegido contra la inyección de SQL de esta manera. Esta pregunta es más para la revisión de código que para el stackoverflow. – Arend

+0

Totalmente de acuerdo, con @Arend. Publicaré un seguimiento. – Rob

+0

¿Las teclas no requieren prefijos de dos puntos? Como en '$ data [': username'] = $ username;' Vea el ejemplo 2 en [PDOStatement :: execute()] (http://www.php.net/manual/en/pdostatement.execute.php) –

Respuesta

7

Sí, su código es seguro. Sin embargo, se puede acortar:

$data = array($username, $password, $this->generate_salt(), $email); 

// If you don't want to do anything with the returned value: 
$this->db->prepare(" 
    INSERT INTO `user` (username, password, salt, email, created) 
    VALUES (?, ?, ?, ?, NOW()) 
")->execute($data); 
+0

Si lo quiere aún más corto, podría encadenar la ejecución en él como '$ sth = $ this-> db-> prepare (" INSERT INTO user (username, password, salt, email, created) VALUES (?,?,? ,?, NOW() ") -> execute ($ data);' :) – Rob

+1

Heh, editado para agregar su sugerencia :-) –

+0

Muchas gracias. En realidad, siempre tiendo a encadenar mucho código para hacerlo corto. :) – Rob

1

Se podría empezar con una matriz vacía para su $data como

// start with an fresh array for data 
$data = array(); 

// imagine your code here 

Su código se ve bien hasta ahora.

EDITAR: Me perdí tu llamada NOW(). También debería agregarlo con una variable de vinculación, como

// bind date 
$data['created'] = date("Y-m-d H:i:s"); 

// updated prepare statement 
$sth = $this->db->prepare("INSERT INTO `user` (username, password, salt, email, created) VALUES (:username, :password, :salt, :email, :created)"); 
+1

¿Por qué? Esto no tiene mucho sentido ... – Shoe

+2

AHORA() no es una función de PHP así que esto arrojaría un error. Si realmente desea utilizar la marca de tiempo del servidor PHP en lugar del servidor de base de datos, debe usar 'date (" Ymd H: i: s ")' http://stackoverflow.com/questions/1995562/now-function-in -php – shanethehat

+0

Tienes toda la razón. – Rob

Cuestiones relacionadas