2011-09-16 31 views
5

Tôi đang học MySQL và PHP thông qua một cuốn sách tại thư viện. Tôi đã cải thiện sự an toàn của hệ thống mã hóa mật khẩu bằng cách thay đổi lưu trữ mật khẩu từCó thể trễ khi sử dụng NOW() trong truy vấn MySQL?

password=SHA('password') 

để

password=SHA(CONCAT('password', '--', registration_date)) 

nơi registration_date là dấu thời gian khi người dùng đăng ký.

Mã hiện cho người dùng đăng ký là:

INSERT INTO users (first_name, last_name, email, password, registration_date) 
VALUES ('first_name', 'last_name', 'email', SHA(CONCAT('password', '--', NOW())), NOW()); 

Tôi có cần phải lo lắng về hai khác nhau NOW() chức năng trong đó? Có khả năng họ có thời điểm hơi khác nhau không? Tôi đã thử nó với một vài truy vấn và nó dường như làm việc ok.

Nếu có sự cố, làm cách nào để khắc phục sự cố?

+0

Bạn tốt hơn, rất, rất, rất, rất, rất chắc chắn rằng trường registration_date không bao giờ có thể bao giờ được cập nhật. Nếu không, bạn sẽ thấy mình với sự thiếu hụt đột ngột của người dùng. –

+0

@Larry - cũng sẽ áp dụng cho trường mật khẩu. :) –

Trả lời

3

Không có vấn đề gì. Từ số manual:

NOW() trả về một khoảng thời gian không đổi cho biết thời gian bắt đầu câu lệnh. (Trong một chức năng lưu trữ hoặc cò, NOW() trả về thời gian mà tại đó các chức năng hoặc kích hoạt tuyên bố bắt đầu thực hiện.)

Như các chương trình thủ công bằng ví dụ, mỗi lần đánh giá của NOW() trong một tuyên bố trả về giá trị tương tự , bất kể có bao nhiêu thời gian trôi qua giữa các đánh giá.

0

Trên một máy chủ, bạn không phải lo lắng. Từ tài liệu:

NOW() trả về thời gian không đổi cho biết thời gian tại đó tuyên bố bắt đầu thực hiện.

(http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_now) Vì vậy, giá trị sẽ không thay đổi trong một truy vấn.

Mặc dù vậy, bạn nên chú ý đến việc sao chép dựa trên câu lệnh. Nếu có cơ hội, cơ sở dữ liệu của bạn được sao chép theo cách này (ví dụ như sao lưu, hoặc HA), thì nô lệ có thể có NOW() khác với chủ.

+0

Điểm tốt về SBR. Master và slave thực sự có các giá trị 'NOW()' khác nhau. Nhưng các giá trị của 'NOW()' trong một hàng của nô lệ sẽ giống nhau trong hàng _. (Tôi nghĩ rằng đây là những gì OP có liên quan có thể thất bại.) Nếu sự khác biệt giữa master và slave 'NOW()' giá trị là một vấn đề, sau đó hàng dựa trên nhân rộng sửa chữa đó. Ngoài ra, người chơi có thể chơi trò chơi với 'SET TIMESTAMP' (ảnh hưởng đến giá trị của' NOW() ') để giải quyết vấn đề. –

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