2012-05-06 27 views
6

Tôi chỉ cần đảm bảo rằng tôi đã có các câu lệnh chuẩn bị PDO chính xác, mã sau có được bảo đảm bằng SQL Injection không?Tuyên bố chuẩn bị PDO, được sử dụng chính xác?

$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

Có vẻ ok. Bạn được bảo vệ chống lại SQL injection theo cách này. Câu hỏi này thêm một cái gì đó cho codereview sau đó stackoverflow. – Arend

+0

Hoàn toàn đồng ý, với @Arend. Tôi sẽ đăng bài theo dõi. – Rob

+0

Các phím không yêu cầu tiền tố đại tràng? Như trong '$ data [': username'] = $ username;' Xem ví dụ 2 tại [PDOStatement :: execute()] (http://www.php.net/manual/en/pdostatement.execute.php) –

Trả lời

7

Có, mã của bạn an toàn. Nó có thể được rút ngắn tuy nhiên:

$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

Nếu bạn muốn nó ngắn hơn, bạn có thể thực hiện chuỗi đó như '$ sth = $ this-> db-> chuẩn bị (" người dùng INSERT INTO (tên người dùng, mật khẩu, muối, email, đã tạo) VALUES (?,?,? ,?, NOW() ") -> thực thi ($ data);' :) – Rob

+1

Heh, chỉnh sửa để thêm gợi ý của bạn :-) –

+0

Rất cám ơn. Trên thực tế tôi luôn có xu hướng chuỗi nhiều mã để làm cho nó ngắn. :) – Rob

1

Bạn có thể bắt đầu với một mảng trống cho bạn $data như

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

// imagine your code here 

Mã của bạn có vẻ tốt cho đến nay.

EDIT: Tôi đã bỏ lỡ cuộc gọi NOW() của bạn. Ngoài ra, bạn cũng nên thêm biến đó bằng biến số liên kết, như

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

Tại sao? Điều này không có ý nghĩa rất nhiều ... – Shoe

+2

NOW() không phải là một hàm PHP vì vậy điều này sẽ ném một lỗi. Nếu bạn thực sự muốn sử dụng dấu thời gian của máy chủ PHP thay vì máy chủ cơ sở dữ liệu, bạn nên sử dụng 'date (" Ymd H: i: s ")' http://stackoverflow.com/questions/1995562/now-function-in -p – shanethehat

+0

Bạn hoàn toàn đúng. – Rob

Các vấn đề liên quan