2012-05-06 10 views
6

Ho solo bisogno di assicurarmi di avere le istruzioni di preparazione PDO corrette, il seguente codice sarà protetto da SQL Injection?Estratto preparato PDO, usato correttamente?

$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

Sembra ok. In questo modo sei protetto contro l'iniezione SQL. Questa domanda più qualcosa per codereview quindi StackOverflow. – Arend

+0

Completamente concordato, con @Arend. Pubblicherò un seguito. – Rob

+0

I tasti non richiedono i prefissi dei due punti? Come in '$ data [': username'] = $ username;' Vedere l'esempio 2 in [PDOStatement :: execute()] (http://www.php.net/manual/en/pdostatement.execute.php) –

risposta

7

Sì, il tuo codice è sicuro. Tuttavia può essere abbreviato:

$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

Se lo vuoi ancora più corto puoi incatenare l'execute in esso come '$ sth = $ this-> db-> prepare (" INSERT INTO utente (username, password, sale, email, creato) VALORI (?,?,? ,?, NOW() ") -> execute ($ data);' :) – Rob

+1

Heh, modificato per aggiungere il tuo suggerimento :-) –

+0

Molte grazie. In realtà, io tendo sempre a concatenare molto codice per renderlo breve. :) – Rob

1

Si potrebbe iniziare con un array vuoto per il vostro $data come

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

// imagine your code here 

il codice sia bene finora.

EDIT: Ho perso la chiamata NOW(). Imho si dovrebbe aggiungere anche con una variabile bind, come

// 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

Perché? Questo non ha molto senso ... – Shoe

+2

NOW() non è una funzione PHP, quindi questo genererebbe un errore. Se si volesse veramente usare il timestamp del server PHP invece del server del database dovresti usare 'date (" Ymd H: i: s ")' http://stackoverflow.com/questions/1995562/now-function-in -php – shanethehat

+0

Hai perfettamente ragione. – Rob