Troy Hunt membuat beberapa poin bagus dalam artikelnya, Segala sesuatu yang Anda ingin tahu tentang membangun fitur reset kata sandi yang aman . Kutipan yang paling relevan adalah:
[T] berikut adalah dua pendekatan umum:
- Buat kata sandi baru di server dan kirimkan melalui email
- Email URL unik yang akan memfasilitasi proses reset
Meskipun banyak petunjuk yang bertentangan, poin pertama adalah benar-benar tidak di tempat yang kita inginkan. Masalah dengan melakukan ini adalah itu berarti kata sandi persisten - yang dapat Anda gunakan kembali dan gunakan kapan saja - kini telah dikirim melalui saluran yang tidak aman dan berada di kotak masuk Anda.
...
Tapi ada satu masalah besar dengan pendekatan pertama karena itu membuat penguncian berbahaya dari sebuah akun menjadi mudah. Jika saya tahu alamat email seseorang yang memiliki akun di sebuah situs web maka saya dapat menguncinya di luar kapan pun saya mau hanya dengan mengatur ulang kata sandi mereka; itu penolakan serangan layanan yang disajikan di piring perak! Inilah sebabnya mengapa reset adalah sesuatu yang seharusnya hanya terjadi setelah berhasil memverifikasi hak pemohon untuk melakukannya.
Ketika kita berbicara tentang URL penyetelan ulang, kita berbicara tentang alamat situs web yang unik untuk contoh khusus proses penyetelan ulang ini.
...
Yang ingin kami lakukan adalah membuat token unik yang dapat dikirim dalam email sebagai bagian dari URL setel kemudian dicocokkan kembali ke catatan di server bersama dengan akun pengguna sehingga mengkonfirmasi pemilik akun email memang satu-satunya yang mencoba mengatur ulang kata sandi. Sebagai contoh, token mungkin "3ce7854015cd38c862cb9e14a1ae552b" dan disimpan dalam tabel bersama ID pengguna yang melakukan reset dan waktu di mana token itu dihasilkan (lebih lanjut tentang itu pada suatu saat). Ketika email dikirim, itu berisi URL seperti "Reset /? Id = 3ce7854015cd38c862cb9e14a1ae552b" dan ketika pengguna memuat ini, halaman memeriksa keberadaan token dan akibatnya mengkonfirmasi identitas pengguna dan memungkinkan kata sandi untuk diubah.
...
Hal lain yang ingin kami lakukan dengan URL reset adalah membatasi waktu token sehingga proses reset harus diselesaikan dalam durasi tertentu, katakan dalam satu jam.
...
Akhirnya, kami ingin memastikan bahwa ini adalah proses satu kali. Setelah proses reset selesai, token harus dihapus sehingga URL reset tidak lagi berfungsi. Seperti pada poin sebelumnya, ini untuk memastikan penyerang memiliki jendela yang sangat terbatas di mana mereka dapat menyalahgunakan URL atur ulang. Plus tentu saja token tidak lagi diperlukan jika proses reset telah selesai dengan sukses.
Dia membuat banyak poin bagus tentang menghindari kebocoran informasi, CAPTCHA, otentikasi dua faktor, dan tentu saja praktik terbaik dasar seperti hashing kata sandi. Saya pikir penting untuk dicatat bahwa saya tidak setuju dengan Troy tentang kegunaan pertanyaan keamanan, lebih memilih skeptisisme Bruce Schneier terhadap praktik tersebut :
Inti dari semua pertanyaan ini adalah sama: kata sandi cadangan. Jika Anda lupa kata sandi, pertanyaan rahasia dapat memverifikasi identitas Anda sehingga Anda dapat memilih kata sandi lain atau meminta situs mengirimkan surel kata sandi Anda saat ini kepada Anda. Ini adalah ide yang bagus dari perspektif layanan pelanggan - pengguna cenderung lupa nama hewan peliharaan pertamanya daripada kata sandi acak - tetapi mengerikan untuk keamanan. Jawaban atas pertanyaan rahasia lebih mudah ditebak daripada kata sandi yang baik, dan informasinya jauh lebih umum.