Upaya login yang gagal memunculkan kata sandi

38

Saya mulai mencatat upaya login yang gagal di situs web saya dengan pesan seperti

Failed login attempt by qntmfred

Saya perhatikan beberapa log ini terlihat seperti

Failed login attempt by qntmfredmypassword

Saya menduga beberapa orang gagal login karena mereka mengetik nama pengguna dan kata sandi mereka di bidang nama pengguna. Kata sandi di-hash dalam database, tetapi jika entah bagaimana db dapat dikompromikan, pesan-pesan log ini bisa menjadi cara bagi penyerang untuk mencari tahu kata sandi untuk persentase kecil orang yang akhirnya gagal masuk seperti ini.

Apakah ada cara yang lebih baik untuk menangani ini? Haruskah saya khawatir tentang kemungkinan ini?

kenwarner
sumber
14
Ya, Anda harus khawatir tentang hal itu.
FoolishSeth
4
Pertanyaan menarik karena melintasi UX dan keamanan. Seperti disebutkan dalam salah satu tautan Michael, Anda dapat mencegah sebagian besar kasus menggunakan Javascript (sisi klien). Nonaktifkan tombol Login saat bidang kata sandi kosong. Pengguna tanpa Javascript masih dapat menggunakan layar login seperti itu, karena tombol tidak akan dinonaktifkan dalam kasus itu.
MSalters

Jawaban:

65

Coba seperti ini:

Jika nama pengguna ada, catat "upaya masuk gagal oleh username". Jika tidak, catat "upaya gagal login oleh IP 123.45.67.89" sebagai gantinya. Itu harus mengatasi masalah memiliki kata sandi muncul di log secara tidak sengaja.

Mason Wheeler
sumber
14
Anda juga dapat memeriksa kata sandi kosong dan gagal dengan kesalahan yang sesuai dalam kasus itu.
Mike Weller
Mencetak nama pengguna adalah masalah yang digambarkan OP. Kadang-kadang login gagal disebabkan oleh pengguna kehilangan kunci [tab] dan dengan cepat mengetik nama pengguna dan kata sandi ke dalam bidang nama pengguna dan menekan enter. Saran Anda tidak menangani ini.
BZink
7
@BZink: Ya, benar. Jika nama pengguna ada , catatlah seperti itu. Jika apa yang dilakukan pengguna secara tidak sengaja menambahkan kata sandi ke nama pengguna, string yang dihasilkan hampir pasti juga bukan nama pengguna yang valid.
Mason Wheeler
12

Mengapa tidak memeriksa saja apakah nama pengguna tersebut ada dalam database? Ini akan memberi Anda 2 hasil yang mungkin.

  1. Pengguna memasukkan nama pengguna yang benar. Anda kemudian dapat dengan mudah mencatat apa yang Anda login sekarang.

  2. Pengguna memasukkan kata sandi di dalam bidang nama pengguna, karena itu nama pengguna tidak valid. Cukup masukkan entri log yang mengatakan bahwa ada upaya login yang gagal oleh pengguna yang tidak dikenal?

Dan tentu saja Anda dapat memiliki bidang tambahan untuk mencatat ip, tanggal dan apa yang tidak?

Galdikas
sumber
3
Mengapa tidak menambahkan hash nama pengguna ke entri log di # 2. Ini akan menyembunyikan kata sandi, tetapi pada saat yang sama memungkinkan seseorang melihat log untuk menentukan apakah ada beberapa upaya oleh pengguna yang tidak dikenal yang sama.
emory
Jika tidak ada catatan yang berisi nama pengguna, jelas mereka salah, jadi ini masih berguna untuk pemecahan masalah.
JeffO
2
@emory, jika pengguna salah mengetik kata sandi mereka bersama dengan nama pengguna, tidak ada cara yang layak untuk mengekstrak hanya bagian nama pengguna dari string. Dan seseorang berulang kali memasukkan kata sandi mereka ke bidang nama pengguna sangat tidak mungkin saya pikir. Ini adalah kesalahan "sekali off" yang Anda lakukan. Terjadi pada yang terbaik dari kita, tetapi saya ragu ada orang yang cukup bodoh untuk terus melakukannya tanpa menyadarinya: D
galdikas
@galdikas Tidak perlu mengekstrak apa pun dari nama pengguna. Misalnya, saya pengguna 'pengguna' dengan kata sandi 'kata sandi'. Saya masuk dengan 'userpassword' dan fungsi hash Anda memetakan 'userpassword' ke 17. Log akan mengatakan "Gagal masuk dengan pengguna tak dikenal 17".
emory
1
@ Galikika Mungkin tidak ada yang bodoh atau cukup gigih untuk terus melakukannya lebih dari beberapa kali, tetapi ada skrip yang bodoh dan cukup gigih untuk melakukannya ribuan kali. Tidakkah Anda ingin tahu bedanya?
emory
1

Pertimbangan:

  1. Dapatkah Anda mendeteksi ketika ini terjadi, sebagai lawan dari seseorang salah mengetik nama pengguna mereka? Mencatat nama pengguna yang salah ketik dapat berguna untuk tujuan dukungan, yaitu menjawab pertanyaan "mengapa saya tidak bisa masuk" dengan jawaban "Anda salah ketik nama pengguna Anda, yang seharusnya berupa tanda hubung bukan titik", atau "Anda memiliki titik dua terkemuka lalu spasi - apakah Anda memotong dan menempelnya ". Jika Anda memiliki sejumlah kecil pengguna berbayar bernilai tinggi (yaitu belum situs jejaring sosial lain) maka Anda mungkin harus menyediakan dukungan semacam ini.

  2. Apa tindakan yang tepat yang harus dilakukan seseorang? Nama pengguna dapat menjadi indikator upaya peretasan. Fakta bahwa nama pengguna tidak muncul dalam daftar Anda tidak berarti Anda tidak perlu tahu apa itu. Namun jika Anda yakin ini adalah masalah serius, dan Anda dapat mendeteksi kata sandi siapa itu, Anda dapat meminta pengguna untuk mengubah kata sandi setelah ini terjadi.

  3. Apa itu praktik industri? Praktik industri adalah mencatat bidang nama pengguna tetapi bukan bidang kata sandi. Anda tidak mungkin dipecat karena melakukan ini.

Kecuali jika Anda memiliki pertimbangan yang tidak biasa, saya akan menyarankan praktik industri berikut ini, dan catat bidang nama pengguna. Pertimbangkan perubahan kata sandi paksa sebagai saran 2 jika menurut Anda ini tidak memadai.

Ben
sumber
1

Supaya aman, login di aplikasi saya saat ini tidak menyimpan parameter yang diteruskan ke metode login atau reset kata sandi. Panggilan log memiliki parameter opsional yang mengontrol ini, yang, ketika diatur ke true, menggantikan objek parameter yang disimpan dengan [Redacted]. Tentu, jadi saya kehilangan sedikit data, tetapi saya memiliki alamat IP mereka, dan saya lebih suka tidak mengambil risiko mendapatkan sesuatu yang sensitif dalam plaintext.

Jika Anda benar-benar ingin mencatat hal semacam ini, saya sarankan saat membuat log masuk upaya, Anda memeriksa database untuk pengguna dengan nama yang cocok dengan yang Anda miliki di bidang nama pengguna, dan hanya menyimpannya jika Anda memiliki kecocokan. Jika tidak, Anda hanya menyimpannya sebagai "pengguna tak dikenal". Anda bisa menjadi mewah, memeriksa apakah nilai ini mengandung itu atau apa pun, tetapi selalu ada risiko bahwa Anda mendapatkan kombinasi seperti [Pengguna] [Kata Sandi] dan [UserPas] [pedang], dalam hal ini Anda dapat memeriksa IP dan menyimpulkan bahwa Anda secara tidak sengaja menyimpan kata sandi seseorang di awal. Anda dapat memperluas ini ke [Pengguna] [Kata Sandi] dan [Kata Kunci Pengguna] yang tidak mungkin tetapi mungkin, dalam hal ini Anda dapat melihat "login yang tidak berhasil oleh UserPassword" diikuti oleh "Login berhasil oleh Pengguna" dan menyimpulkan semuakata sandi pengguna. Secara umum, untuk amannya saya katakan untuk tidak mencatat nama pengguna kecuali jika login berhasil.

Edit untuk ditambahkan:

Sebagian besar argumen yang diposkan orang untuk mencatat nama pengguna karena upaya login yang gagal, menurut pendapat saya, lebih baik ditangani melalui metode lain.

Sebagai contoh, dikatakan bahwa ketika seorang pelanggan bertanya "mengapa saya tidak bisa masuk?", Nama pengguna yang masuk akan memungkinkan Anda untuk menunjukkan kesalahan ketik. Ini benar, tetapi tidak sepadan dengan risiko juga mendapatkan kata sandi; Saya akan melakukan ini dengan mengarahkan kembali pengguna ke formulir login jika gagal, menyorot bidang nama pengguna dan mengisinya kembali dengan apa pun yang mereka ketikkan sehingga mereka dapat melihat sendiri.

Argumen lain adalah itu memungkinkan Anda mengidentifikasi upaya peretasan; serangkaian kegagalan terhadap satu nama pengguna mungkin merupakan upaya untuk memaksa kata sandi. Saya akan melakukan ini dengan memiliki kolom "BadLogins" pada tabel Users, yang bertambah setiap kali login gagal dengan nama pengguna yang cocok dengan pengguna ini, dan disetel ulang ke nol pada login yang berhasil, setelah memberi tahu pengguna "telah ada x upaya login yang gagal sejak login terakhir Anda "dan memberi tahu mereka tentang apa yang harus dilakukan jika mereka tidak menganggap upaya itu dari mereka. Jika Anda ingin benar-benar teliti, Anda bisa memiliki kolom lain yang menyimpan nilai terakhir dari kolom BadLogins bahkan setelah login berhasil, dan / atau kolom yang menyimpan nilai tertinggi kolom ini, dan / atau kolom yang menyimpan jumlah total login gagal yang pernah dimiliki akun ini.

anaximander
sumber