Forgot password thật đơn giản
Security
32
bảo mật
8
White

Ôm Boom viết ngày 18/08/2017

Quên mật khẩu là một tính năng mà hấu hết các ứng dụng đều có.

Đôi khi nó cũng vô cùng hữu ích. Nhưng đây cũng chính là một back-door để chiếm tài khoản của người dùng.

Đây là một tính năng mình cho là đơn giản. Nhưng gần đây khi đọc một Pull Request của Laravel, mình tìm hiểu kỹ hơn và thấy nó không hề đơn giản như mình vẫn tưởng. Mình nghĩ cũng có nhiều bạn đang mắc phải một số sơ xuất khi implement tính năng forgot password vào ứng dụng của mình.

alt text

Gửi mật khẩu cũ cho người dùng

"Người dùng quên mật khẩu mà, vậy chúng ta nên gửi lại mật khẩu cho người dùng chứ."

Bạn đừng bao giờ suy nghĩ như vậy. Bởi vì để gửi được mật khẩu cũ cho người dùng, bạn sẽ cần phải lưu trữ mật khẩu của người dùng ở dạng plain text. Hoặc encrypt bằng một thuật toán của bạn nghĩ ra. Điều gì sẽ xảy ra khi hacker chiếm được database hoặc đọc chúng thông qua các lỗ hổng như SQL Injection. Toàn bộ mật khẩu của người dùng sẽ lọt vào tay hacker.

Tất nhiên, bạn cũng có thể sử dụng các thuật toán ecryption mạnh hơn như RSA chẳng hạn. Nhưng mình sẽ không yên tâm nếu admin của một trang nào đó có thể soi mói được mật khẩu cá nhân của mình. Và mình tin bạn cũng như vậy.

Nên đây là cách bạn nên loại bỏ đầu tiên.

Tạo mật khẩu ngẫu nhiên

Một số ứng dụng sẽ tạo mật khẩu ngẫu nhiên và gửi vào email của bạn. Với cách này bạn sẽ không cần phải lưu mật khẩu của người dùng ở dạng plain text nữa. Chỉ cần người dùng nhập đúng email. Và bạn sinh ra một chuỗi ngẫu nhiên khoảng 10-12 ký tự hoặc nhiều hơn và gửi vào email cho người dùng. Thật đơn giản.

Nhưng vấn đề của phương pháp này là nếu người dùng không thực sự yêu cầu đổi mật khẩu thì sao? Lúc đó người dùng sẽ gặp khó khăn khi không thể truy cập được vào ứng dụng vì mật khẩu đã bị thay đổi.

Tất nhiên bạn cũng có thể không đổi ngay mật khẩu của người dùng mà sử dụng một bảng tạm và cho phép người dùng đăng nhập bằng cả mật khẩu cũ và mật khẩu mới. Nhưng nghe có vẻ phức tạp :grin::grin::grin:

Đây cũng là một phương pháp mình nghĩ là không nên sử dụng trừ khi bạn muốn nghe điện thoại của khách hàng hỏi tại sao chương trình cứ báo mật khẩu sai trong khi tôi nhập đúng, thế bây giờ là tôi đúng hay anh đúng?.

Tạo chuỗi ngẫu nhiên

Đây là cách khá phổ biến hiện nay đó là tạo một chuỗi ngẫu nhiên và gửi vào email của người dùng. Khi người dùng nhấn vào đường link có chuỗi ngẫu nhiên đó sẽ dẫn tới trang cho phép người dùng đặt lại mật khẩu.

Cách này không có vấn đề gì hết. Thực ra mình đùa thôi, nếu không có vấn đề gì thì đã không có bài viết này rồi.

Cách này có một vấn đề là khi Hacker đọc được database, hacker hoàn toàn có thể chiếm được tài khoản của người dùng.

Hacker lấy được email của người dùng từ database. Nhập email đó vào form, nhấn submit. Sau đó tạo link reset mật khẩu từ chuỗi vừa được sinh ra trong datatabase.

Thực ra thì tới đây đã tạm ổn rồi. Miễn là bạn phải đảm bảo chương trình của bạn không dính phải bất kỳ lỗi SQL Injection nào, không thể upload file độc hại, không dính lỗi command injection.v.v....

Vẫn tạo chuỗi ngẫu nhiên

Thực ra đây là phiên bản nâng cấp của cách trên một chút.

Đầu tiên bạn tạo một chuỗi ngẫu nhiên M08TkdPkMHVyk4jpKDM5 gọi là $token. Giờ bạn gửi chuỗi token này về email của người dùng.

https://secure.com/reset-password?token=M08TkdPkMHVyk4jpKDM5

Sau đó bạn sử dụng các thuật toán hash scrypt, bcrypt, pbkdf2, hoặc dùng md5, sha1, sha256~ tuy nhiên điều này không được khuyến khích. Nếu bạn dùng các thuật toán như md5, sha1, sha256 thì nên sử dụng một chuỗi $secret nữa để tăng độ khó khi hacker revert chuỗi ban đầu.

Ở đây mình sử dụng pbkdf2 với số lần lặp là 1000 và salt là W02meFs848 kết quả sẽ được một chuỗi như sau.

pbkdf2:$1000$W02meFs848$878fdfd75a0cf51eb409bf320d5fcefb7cbb1eb5138e364cb8fb461a433f5421

Bây giờ sẽ lưu chuỗi này vào database và gửi đường link tới email của người dùng.

https://secure.com/reset-password?token=M08TkdPkMHVyk4jpKDM5

Phương pháp này đảm bảo rằng khi hacker lấy có đọc được database nhưng cũng không thể có được chuỗi token thực sự đã được gửi về cho người dùng.

Túm váy lại

Forgot password là một tính năng hữu dụng, nhưng đồng thời cũng để lộ những kẻ hở để hacker có thể chôm chỉa tài khoản của người dùng.

Hi vọng qua bài viết này có thể giúp bạn có được một cách mới để đảm bảo an toàn cho ứng dụng chưa an toàn, và an toàn hơn cho ứng dụng đã an toàn :smile::smile::smile:

Bài viết truyền cảm hứng

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Ôm Boom

10 bài viết.
35 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
12 3
Nhiều khi chúng ta cần một start một project nhỏ gọn, không cần phải quá cầu kỳ, nhưng lại quá quen thuộc với Eloquent của Laravel. Vậy làm sao để ...
Ôm Boom viết gần 2 năm trước
12 3
White
12 1
Hm, lâu rồi mình cũng không viết bài nào mới. Chủ yếu là do dạo này tập ngủ sớm mà lại đi làm về khá muộn nên leo lên giường đi ngủ luôn đâm cũng l...
Ôm Boom viết 1 năm trước
12 1
White
11 6
Virtual Host Virtual Host là một cấu hình trong Apache để cho phép nhiều domain cùng chạy trên một máy chủ. Có một khái niệm khác được đề cập tới ...
Ôm Boom viết hơn 3 năm trước
11 6
Bài viết liên quan
White
37 11
Có 1 kiểu tấn công vào website mà chúng ta không thể nào chống được, dù có làm thế nào đi nữa: DDOS. Đây cũng là một từ rất hay dc nhắc đến và rất...
quocnguyen viết gần 3 năm trước
37 11
White
20 4
(Ảnh) Nếu máy tính của bạn đã bị lây nhiễm, mã độc có thể lây lan tới trang web của bạn thông qua trình soạn thảo văn bản và (Link). Dùng các mật ...
Juno_okyo viết hơn 1 năm trước
20 4
White
26 4
Mỗi khi đăng những bài (Link) về một (Link) được phát hiện trên một trang web nào đó, tôi biết sẽ có những người nhếch mép cười khẩy vì lúc đó tron...
Juno_okyo viết 2 năm trước
26 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
10 bài viết.
35 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!