Apa cara terbaik untuk menerapkan "ingat saya" untuk situs web? [Tutup]

510

Saya ingin situs web saya memiliki kotak centang yang dapat diklik pengguna sehingga mereka tidak perlu masuk setiap kali mereka mengunjungi situs web saya. Saya tahu saya perlu menyimpan cookie di komputer mereka untuk mengimplementasikan ini, tetapi apa yang harus terkandung dalam cookie itu?

Juga, apakah ada kesalahan umum yang harus diperhatikan untuk menjaga cookie ini tidak menghadirkan kerentanan keamanan, yang dapat dihindari sambil tetap memberikan fungsionalitas 'ingat saya'?

Vort3x
sumber
5
Periksa stackoverflow.com/questions/549/… (bagian II dari jawaban teratas)
Frosty Z
jika Anda menggunakan ASP.NET, periksa codeproject.com/Articles/779844/Remember-Me
Believe2014
1
Ada beberapa info yang sangat berguna di Security SE ~ security.stackexchange.com/questions/19676/…
b1nary.atr0phy
Jawaban yang diterima saat ini oleh splattne terlalu rumit. Buat token +16 byte dari sumber acak, hash itu, dan simpan id akun hash + dalam database. Kemudian kirim token kepada pengguna (base64 disandikan) dalam cookie HTTPS + httpOnly (sehingga Javascript tidak dapat mengakses / mencurinya). Dengan cara ini, tidak ada yang bisa menebak token atau mengeluarkan orang dengan tebakan yang tidak valid, namun bahkan jika database Anda diretas, tidak ada yang bisa menggunakan token dalam database (mereka di-hash). Jadi hanya klien asli (atau seseorang yang mencuri token dari toko browser) yang dapat menggunakannya.
Xeoncross

Jawaban:

536

Praktek Terbaik Cookie Persistent yang Ditingkatkan

Anda dapat menggunakan strategi ini yang dijelaskan di sini sebagai praktik terbaik (2006) atau strategi terbaru yang dijelaskan di sini (2015):

  1. Ketika pengguna berhasil masuk dengan Remember Me dicentang, cookie masuk dikeluarkan selain cookie manajemen sesi standar.
  2. Cookie login berisi pengidentifikasi seri dan token . Serial dan token adalah angka acak yang tidak dapat diakses dari ruang yang cukup besar. Keduanya disimpan bersama dalam tabel database, token di-hash (sha256 baik-baik saja).
  3. Ketika pengguna yang tidak masuk mengunjungi situs dan menyajikan cookie masuk, pengidentifikasi seri dicari dalam database .
    1. Jika pengidentifikasi seri hadir dan hash token cocok dengan hash untuk pengenal seri itu, pengguna dianggap diautentikasi . Sebuah token baru yang dihasilkan, hash baru untuk token disimpan selama rekor lama, dan cookie login baru dikeluarkan untuk pengguna (apa-apa untuk kembali menggunakan seri identifier ).
    2. Jika seri ada tetapi token tidak cocok, pencurian diasumsikan. Pengguna menerima peringatan dengan kata-kata keras dan semua sesi yang diingat pengguna dihapus.
    3. Jika nama pengguna dan seri tidak ada, cookie masuk diabaikan .

Pendekatan ini memberikan pertahanan yang mendalam. Jika seseorang berhasil membocorkan tabel database, itu tidak memberikan penyerang pintu terbuka untuk menyamar sebagai pengguna.

splattne
sumber
20
lihat juga: stackoverflow.com/questions/549/... Anda tidak boleh membaca versi yang 'ditingkatkan'
Jacco
8
Masalahnya adalah Anda mengekspos nama pengguna dalam cookie, meskipun ini yang dilakukan Gmail. Mengapa Anda membutuhkan ID seri dan token? Bukankah token yang lebih besar tidak masalah?
Dan Rosenstark
10
Juga, mengenai model ini, apa yang mencegah penyerang mencuri dan daripada menempatkan cookie di komputernya dan menghapus cookie dari komputer yang diretas. Komputernya akan dibuktikan keasliannya dan dimutakhirkan sesuai kebutuhan tanpa ada komputer yang diretas? Satu-satunya perubahan adalah bahwa pengguna komputer yang diretas harus masuk lagi dan mengatur mengingat saya. Apakah pengguna yang diretas mengenali atau tidak ini tidak pasti.
24
@HiroProtagonist Seri Identifier adalah untuk mencegah serangan DoS. Tanpa itu, saya dapat dengan cepat menulis naskah yang mengenai situs Anda dengan setiap nama pengguna dan token yang tidak valid, mencatat semua orang di situs Anda.
Chris Moschini
6
Solusi ini SALAH, tidak menangani cuncurrency: Jika dua permintaan otentikasi ingat-saya tiba pada saat yang sama, dengan cookie ingat-sama yang sama, yang pertama berhasil dan mengubah token, yang kedua menyebabkan otentikasi yang tidak berhasil, dan alarm palsu (karena token telah diubah oleh permintaan pertama). (Situasi ini dapat terjadi ketika browser mulai, dan situs dikembalikan dalam dua tab browser.)
slobo
9

Saya akan menyimpan ID pengguna dan token. Ketika pengguna kembali ke situs, bandingkan kedua informasi tersebut dengan sesuatu yang persisten seperti entri basis data.

Adapun keamanan, hanya saja tidak memasukkan apa pun di sana yang akan memungkinkan seseorang untuk memodifikasi cookie untuk mendapatkan manfaat tambahan. Misalnya, jangan menyimpan grup pengguna atau kata sandi mereka. Apa pun yang dapat dimodifikasi yang akan menghindari keamanan Anda tidak boleh disimpan dalam cookie.

dragonmantank
sumber
8

Simpan UserId mereka dan RememberMeToken. Ketika mereka masuk dengan mengingat saya diperiksa menghasilkan RememberMeToken baru (yang membatalkan mesin lain yang ditandai ingat saya).

Ketika mereka kembali mencari mereka dengan token ingat saya dan pastikan UserId cocok.

jonnii
sumber
Ini bisa menjadi kekerasan paksa dalam hitungan detik. Saya hanya akan mengatur user_id saya menjadi 1 dan memaksa semua token. Ini akan memberi saya akses dalam hitungan detik
A Friend
4

Menyelidiki sesi persisten sendiri saya telah menemukan bahwa itu sama sekali tidak sebanding dengan risiko keamanan. Gunakan jika Anda benar-benar harus, tetapi Anda harus mempertimbangkan sesi seperti itu hanya diautentikasi dengan lemah dan memaksakan login baru untuk apa pun yang bisa bernilai bagi penyerang.

Alasannya tentu saja adalah bahwa cookie Anda yang berisi sesi persisten Anda begitu mudah dicuri.

4 cara untuk mencuri cookie Anda (dari komentar oleh Jens Roland di halaman @splattneberdasarkan jawabannya pada):

  1. Dengan mencegatnya melalui saluran yang tidak aman (paket sniffing / pembajakan sesi)
  2. Dengan secara langsung mengakses browser pengguna (melalui malware atau akses fisik ke kotak)
  3. Dengan membacanya dari database server (mungkin SQL Injection, tapi bisa apa saja)
  4. Dengan hack XSS (atau eksploitasi sisi klien serupa)
Jarl
sumber
104
1. HTTPS dirancang untuk mencegah hal ini. 2. Tetap Masuk Bukan masalah keamanan di sini, Anda memiliki masalah yang lebih besar. 3. Sama seperti 2. 4. Hal ini dapat dicegah dengan kebijakan kontrol akses dan sanitasi input yang baik; jika Anda tidak mengambil langkah-langkah ini, Anda lagi memiliki masalah yang lebih besar daripada Tetap Masuk.
Chris Moschini