Praktik terbaik untuk Otentikasi / Keamanan aplikasi web (Platform Apa Pun)

12

Saya mendapat pertanyaan hari ini dari manajer saya yang menanyakan pemikiran saya tentang apa yang dianggap sebagai desain yang dapat diterima untuk otentikasi aplikasi formulir web, terutama dalam hal sifat dari banyak browser populer untuk "Remember Password" untuk bidang login kata sandi nama pengguna Anda yang khas .

Saya mengalami masalah dengan jawaban yang saya rasa dapat diterima. Mengingat kelemahan keamanan Sony yang memalukan, saya benar-benar ingin berhati-hati, meskipun data yang disimpan pada orang-orang memiliki sensitivitas yang lebih rendah. Kami tidak menyimpan nomor jaminan sosial atau bahkan alamat, tetapi kami menyimpan nomor telepon, alamat email dan foto pengunjung.

Dia khawatir bahwa pengguna dapat dengan mudah mengingat kata sandi pada terminal publik, maka seseorang dapat langsung melompat pada terminal ini dan mulai melihat atau memodifikasi data dengan cara yang tidak sah. Namun saya cukup yakin bahwa setidaknya pada workstation Windows bahwa browser tidak akan "Ingat Kata Sandi" di seluruh akun pengguna Windows.

Di luar ini saya menerapkan enkripsi kata sandi satu arah di sisi server (menyimpan kata sandi terenkripsi dalam database, mengenkripsi kata sandi yang disediakan pengguna di server, dibandingkan dengan string terenkripsi dari database). Tidak ada rencana segera untuk memasukkan enkripsi SSL namun ini masih merupakan opsi.

Apakah ada kelemahan keamanan utama dengan pendekatan ini? Apakah Anda punya saran yang lebih baik?

maple_shaft
sumber
Saat menyimpan kata sandi terenkripsi satu arah (yaitu hash), pastikan Anda menggunakan hash yang kuat (yaitu bukan MD5) atau memberi garam kata sandi (lihat stackoverflow.com/questions/420843/… ) atau keduanya.
Jordan Reiter
Lihatlah situs web OWASP ( owasp.org ). Mereka memiliki banyak informasi keamanan yang sangat berguna, termasuk "lembar contekan" untuk berbagai protokol.
Ralph
Ada beberapa pedoman untuk autentikasi situs web berbasis formulir di sini stackoverflow.com/a/477578/463478
Only You

Jawaban:

13

Beberapa tips tingkat tinggi:

  1. Simpan hanya data yang Anda butuhkan
  2. Selalu mengenkripsi data sensitif (SSN, kata sandi, # kartu kredit, dll.) Saat Anda menyimpannya
  3. Selalu mengenkripsi lalu lintas menggunakan SSL saat mengirim / menerima data sensitif
  4. Jika ragu tentang kepekaan informasi, enkripsi itu
  5. Jangan percayai input pengguna (seseorang akan mencoba memasukkan sesuatu yang buruk)
  6. Jangan percayai data Anda (seseorang dapat mengubahnya dalam database - misalnya, menyuntikkan skrip berbahaya)
  7. Jangan gulung enkripsi Anda sendiri
  8. Amankan server yang menampung aplikasi / database
  9. Tingkatkan beban pengguna akhir demi keamanan (pembatasan kata sandi, jangan pernah membuka kata sandi, jangan kirim URL melalui email, kurangi waktu sesi, dll.)

Saran saya kepada Anda adalah untuk mendapatkan buku tentang pengamanan aplikasi Web. Ada terlalu banyak informasi untuk disampaikan dalam satu jawaban / blog / artikel. Topik enkripsi saja cukup besar.

Mayo
sumber
Apa alasan di balik penggunaan SSL alih-alih menggulirkan enkripsi sendiri? Apakah Anda mempertimbangkan untuk menggunakan sesuatu seperti WS-Security menggulung enkripsi Anda sendiri? Menyiapkan SSL bisa sangat menyebalkan.
Tuan Jefferson
Ini daftar periksa yang bagus. Saya terkejut bahwa tidak ada suara lebih di atasnya.
Kristofer Hoch
2
@ Mr.Jefferson, saya akan mengatakan 99,999999% dari waktu Anda TIDAK PERNAH ingin "menggulung enkripsi Anda sendiri".
Zach Leighton
2

Anda dapat mencoba untuk meningkatkan perilaku browser - beberapa saran bagus di sini:

/programming/32369/disable-browser-save-password-functionality

Chad Thompson
sumber
1
Tautan yang bagus. Saya pribadi tidak berpikir itu adalah bisnis kami sebagai pengembang untuk mengesampingkan pilihan pengguna seperti itu, tetapi saya telah melakukan situs untuk klien yang menuntutnya, jadi penting untuk mengetahui bagaimana melakukannya.
Carson63000
1

Saya katakan Anda harus baik-baik saja.

Sebagian besar pengguna akan cukup pintar untuk tidak menyimpan kata sandi mereka di terminal publik, dan kata sandi akan disimpan per profil. Ingatlah bahwa mereka dapat dengan mudah menuliskannya pada catatan tempel atau menggunakan kata sandi yang lemah.

Jika halaman login tidak dienkripsi melalui SSL, tidak akan terlalu sulit bagi penyerang untuk mengendus kata sandi itu saat melakukan perjalanan melalui jaringan. Namun, pekerjaan yang baik membuat kata sandi dalam database, yang akan mencegah penyerang potensial melihat kata sandi semua orang (yang dapat mereka gunakan dengan alamat email untuk mencoba masuk ke situs lain di mana pengguna mungkin berada.)

Jika Anda masih ingin, ada cara untuk menonaktifkan perilaku browser seperti yang ditunjukkan Chad. Saya hanya melihat ini sendiri di situs web bank saya dan sistem Microsoft Live.

David Hogue
sumber
Posting yang bagus, saya lupa menambahkan bahwa nama pengguna tidak akan menjadi alamat email, namun seorang pengguna akan memiliki alamat email yang disimpan dalam sistem. Lucu Anda sebutkan ini karena bahkan situs populer seperti Facebook pun rentan terhadap paket sniffing untuk addys email dan kata sandi.
maple_shaft
Saya juga ingin menambahkan bahwa saya tidak menunjukkan kelemahan keamanan di Facebook sebagai "alasan" tentu untuk model keamanan yang buruk dalam aplikasi saya. Hanya karena ibu Joey mengizinkannya menonton film berperingkat R tidak membuatnya menjadi benar :)
maple_shaft
1

Pada titik tertentu, Anda tidak dapat (dan tidak diwajibkan secara hukum untuk) melindungi pengguna dari diri mereka sendiri. Fungsionalitas "Ingat kata sandi" mungkin berisiko, tetapi itu risiko yang ditanggung oleh pengguna. Demikian juga, jika pengguna memutuskan untuk menggunakan kembali kata sandi mereka untuk beberapa layanan, mereka juga menanggung risiko itu. Anda juga tidak diharuskan memperingatkan mereka untuk tidak menuliskan kata sandi mereka pada catatan tempel dan menempelkannya ke monitor mereka, meskipun pengguna juga sering melakukannya.

Begitulah, sampai seseorang berhasil litigasi dan mengubah aturan. Lihat juga: "Peringatan: isinya mungkin panas".

Rein Henrichs
sumber
0

Saya tidak berpikir Anda dapat mengontrol apakah browser mengingat kata sandi atau tidak. Itu hanya di luar tangan Anda apakah browser melakukan itu atau tidak. Itu juga bukan risiko keamanan yang besar bagi Anda . Anda harus selalu menganggap bahwa serangan dapat dilakukan dari login yang valid. Jangan berasumsi karena seseorang memiliki pengguna login yang sah / lulus bahwa mereka tidak akan berbuat baik. Bagaimanapun, ada banyak cara kata sandi dapat jatuh ke tangan yang salah.

Saya kira Yang bisa Anda lakukan adalah mengacak nama bidang dalam formulir login Anda setiap kali. Alih-alih <input name="username", gunakan sesuatu seperti <input name="user658667587". Itu akan membuat nama pengguna yang di-cache cukup tidak berguna. Tapi saya tidak tahu apakah biaya overhead akan sepadan. Belum lagi merepotkan pengguna yang Arent pada mesin publik.

Jika Anda berada dalam situasi yang sangat peka terhadap keamanan (perbankan, investasi), Anda bisa bertanya kepada orang-orang saat masuk apakah itu mesin publik. Anda juga dapat melakukan cache alamat IP yang diketahui ketika orang-orang masuk, dan jika mereka login dari lokasi yang berbeda memerlukan nomor pin yang tidak dapat diketik (mis, klik gambar) di samping pengguna / pass normal. Bank saya melakukan sesuatu yang mirip dengan itu.

GrandmasterB
sumber