Bạn không bao giờ được thoát, cắt hoặc sử dụng bất kỳ cơ chế làm sạch nào khác trên mật khẩu mà bạn sẽ băm bằng PHP password_hash()
vì một số lý do, trong đó lý do lớn nhất là vì việc làm sạch thêm mật khẩu yêu cầu mã bổ sung không cần thiết.
Bạn sẽ lập luận (và bạn thấy điều đó trong mọi bài đăng mà dữ liệu người dùng được chấp nhận sử dụng trong hệ thống của bạn) rằng chúng tôi nên xóa tất cả thông tin người dùng nhập và bạn sẽ đúng đối với mọi thông tin khác mà chúng tôi chấp nhận từ người dùng của mình. Mật khẩu là khác nhau. Mật khẩu băm không thể cung cấp bất kỳ mối đe dọa tiêm SQL nào vì chuỗi được chuyển thành băm trước khi lưu trữ trong cơ sở dữ liệu.
Hành động băm mật khẩu là hành động làm cho mật khẩu được lưu trữ an toàn trong cơ sở dữ liệu của bạn. Hàm băm không mang lại ý nghĩa đặc biệt cho bất kỳ byte nào, vì vậy không cần làm sạch đầu vào của nó vì lý do bảo mật
Nếu bạn tuân theo các câu thần chú về việc cho phép người dùng sử dụng mật khẩu / cụm từ mà họ mong muốn và bạn không giới hạn mật khẩu , thì việc cho phép bất kỳ độ dài nào, bất kỳ số lượng khoảng trắng nào và bất kỳ ký tự đặc biệt nào được băm sẽ giúp mật khẩu / cụm mật khẩu an toàn bất kể nội dung nào được chứa bên trong Mật khẩu. Kể từ bây giờ, hàm băm phổ biến nhất (mặc định), PASSWORD_BCRYPT
hãy biến mật khẩu thành một chuỗi rộng 60 ký tự chứa muối ngẫu nhiên cùng với thông tin mật khẩu được băm và chi phí (chi phí thuật toán để tạo hàm băm):
PASSWORD_BCRYPT được sử dụng để tạo hàm băm mật khẩu mới bằng thuật toán CRYPT_BLOWFISH. Điều này sẽ luôn dẫn đến một hàm băm sử dụng định dạng crypt "$ 2y $", luôn có độ rộng 60 ký tự.
Các yêu cầu về không gian để lưu trữ hàm băm có thể thay đổi khi các phương pháp băm khác nhau được thêm vào hàm, vì vậy tốt hơn hết là bạn nên mở rộng loại cột cho hàm băm được lưu trữ, chẳng hạn như VARCHAR(255)
hoặc TEXT
.
Bạn có thể sử dụng một truy vấn SQL hoàn chỉnh làm mật khẩu của mình và nó sẽ được băm, làm cho nó không thể giải được bằng công cụ SQL, ví dụ:
SELECT * FROM `users`;
Có thể được băm thành $2y$10$1tOKcWUWBW5gBka04tGMO.BH7gs/qjAHZsC5wyG0zmI2C.KgaqU5G
Hãy xem các phương pháp khử trùng khác nhau ảnh hưởng đến mật khẩu như thế nào -
Mật khẩu là I'm a "dessert topping" & a <floor wax>!
(Có 5 khoảng trắng ở cuối mật khẩu không được hiển thị ở đây.)
Khi chúng tôi áp dụng các phương pháp cắt tỉa sau đây, chúng tôi nhận được một số kết quả khác nhau:
var_dump(trim($_POST['upassword']));
var_dump(htmlentities($_POST['upassword']));
var_dump(htmlspecialchars($_POST['upassword']));
var_dump(addslashes($_POST['upassword']));
var_dump(strip_tags($_POST['upassword']));
Các kết quả:
string(40) "I'm a "dessert topping" & a <floor wax>!" // spaces at the end are missing
string(65) "I'm a "dessert topping" & a <floor wax>! " // double quotes, ampersand and braces have been changed
string(65) "I'm a "dessert topping" & a <floor wax>! " // same here
string(48) "I\'m a \"dessert topping\" & a <floor wax>! " // escape characters have been added
string(34) "I'm a "dessert topping" & a ! " // looks like we have something missing
Điều gì xảy ra khi chúng tôi gửi những thứ này đến password_hash()
? Tất cả chúng đều được băm, giống như truy vấn đã làm ở trên. Vấn đề xảy ra khi bạn cố gắng xác minh mật khẩu. Nếu chúng tôi sử dụng một hoặc nhiều phương pháp này, chúng tôi phải sử dụng lại chúng trước khi so sánh với chúng password_verify()
. Những điều sau sẽ không thành công:
password_verify($_POST['upassword'], $hashed_password); // where $hashed_password comes from a database query
Bạn sẽ phải chạy mật khẩu đã đăng thông qua phương pháp làm sạch bạn đã chọn trước khi sử dụng kết quả của việc đó trong xác minh mật khẩu. Đây là một tập hợp các bước không cần thiết và sẽ làm cho việc băm không tốt hơn.
Sử dụng phiên bản PHP nhỏ hơn 5.5? Bạn có thể sử dụng password_hash()
gói tương thích .
Bạn thực sự không nên sử dụng băm mật khẩu MD5 .