Saya ingin menulis ulang skrip login saya untuk situs web klien agar lebih aman. Saya ingin tahu praktik terbaik apa yang dapat saya terapkan dalam hal ini. Panel kontrol yang dilindungi kata sandi ada dalam kelimpahannya, tetapi sangat sedikit yang tampaknya memuji praktik terbaik dalam hal penulisan kode, kecepatan dan keamanan.
Saya akan menggunakan PHP dan database MYSQL.
Saya dulu menggunakan md5, tapi saya melihat bahwa sha256 atau sha512 akan lebih baik (bersama dengan hash dan garam aman).
Beberapa skrip login mencatat alamat ip sepanjang sesi atau bahkan agen pengguna, tetapi saya ingin menghindarinya karena tidak kompatibel dengan server proxy.
Saya juga sedikit di belakang praktik terbaik dalam menggunakan sesi di PHP 5 (terakhir kali saya membaca adalah PHP 4) sehingga beberapa praktik terbaik dengan ini akan sangat membantu.
Terima kasih.
sumber
Jawaban:
Pikiran terbaik adalah tidak menemukan kembali roda. Tapi, saya mengerti, di dunia PHP mungkin sulit untuk menemukan komponen berkualitas tinggi yang sudah melakukan itu (bahkan saya cukup yakin bahwa kerangka kerja mengimplementasikan hal-hal seperti itu dan implementasinya sudah diuji, solid, ditinjau kode, dll. )
Jika, karena beberapa alasan, Anda tidak bisa menggunakan kerangka kerja, inilah beberapa saran:
Saran terkait keamanan
Gunakan PBKDF2 atau Bcrypt jika Anda bisa . Itu dilakukan untuk itu.
Dasar Pemikiran: kedua algoritme dapat membuat proses hashing menjadi lambat secara sewenang-wenang, yang persis seperti yang Anda inginkan ketika hashing password (alternatif yang lebih cepat berarti kekuatan kasar yang lebih mudah). Idealnya, Anda harus menyesuaikan parameter sehingga proses menjadi lebih lambat dan lebih lambat dari waktu ke waktu pada perangkat keras yang sama, sementara perangkat keras baru yang lebih cepat dirilis.
Jika Anda tidak bisa, setidaknya jangan gunakan MD5 / SHA1. Tak pernah. Lupakan itu . Gunakan SHA512 sebagai gantinya, misalnya. Gunakan garam juga.
Dasar Pemikiran: MD5 dan SHA1 terlalu cepat. Jika penyerang memiliki akses ke database Anda yang berisi hash dan memiliki (bahkan tidak terlalu) mesin yang kuat, kasar memaksa kata sandi cepat dan mudah. Jika tidak ada garam, kemungkinan penyerang menemukan kata sandi yang sebenarnya meningkat (yang bisa membahayakan tambahan jika kata sandi itu digunakan kembali di tempat lain).
Di PHP 5.5.0 dan yang lebih baru, gunakan
password_hash
danpassword_verify
.Dasar Pemikiran: memanggil fungsi yang disediakan oleh kerangka kerja itu mudah, sehingga risiko membuat kesalahan berkurang. Dengan kedua fungsi tersebut, Anda tidak perlu memikirkan parameter yang berbeda seperti hash. Fungsi pertama mengembalikan string tunggal yang kemudian dapat disimpan dalam database. Fungsi kedua menggunakan string ini untuk verifikasi kata sandi.
Lindungi diri Anda dari kekerasan . Jika pengguna mengirimkan kata sandi yang salah ketika dia sudah mengirimkan kata sandi yang salah lain 0,01 detik yang lalu, itu alasan yang baik untuk memblokirnya. Sementara manusia bisa mengetik cepat, mereka mungkin tidak dapat yang cepat.
Perlindungan lain adalah dengan menetapkan batas kegagalan per jam. Jika pengguna mengirimkan 3600 kata sandi yang salah dalam satu jam, 1 kata sandi per detik, sulit untuk percaya bahwa ini adalah pengguna yang sah.
Dasar Pemikiran: jika kata sandi Anda di-hash dengan cara yang tidak aman, brute force bisa sangat efektif. Jika kata sandi disimpan dengan aman, brute force masih menyia-nyiakan sumber daya server dan bandwidth jaringan Anda, menyebabkan kinerja yang lebih rendah untuk pengguna yang sah. Deteksi brute force tidak mudah untuk dikembangkan dan dilakukan dengan benar, tetapi untuk sistem apa pun kecuali yang kecil, itu sangat berharga.
Jangan meminta pengguna Anda untuk mengubah kata sandi mereka setiap empat minggu. Ini sangat menjengkelkan dan mengurangi keamanan, karena mendorong keamanan berbasis post-it.
Dasar Pemikiran: gagasan bahwa memaksa kata sandi untuk diubah setiap n minggu melindungi sistem dari brute force adalah salah. Serangan brute force biasanya berhasil dalam hitungan detik, menit, jam atau hari, yang membuat perubahan kata sandi bulanan tidak relevan. Di sisi lain, pengguna buruk dalam mengingat kata sandi. Jika, lebih dari itu, mereka perlu mengubahnya, mereka akan mencoba menggunakan kata sandi yang sangat sederhana atau hanya mencatat kata sandi mereka pada post-it-nya.
Audit segalanya, setiap saat. Simpan log masuk, tetapi jangan pernah menyimpan kata sandi dalam log audit. Pastikan bahwa log audit tidak dapat dimodifikasi (yaitu Anda dapat menambahkan data di akhir, tetapi tidak mengubah data yang ada). Pastikan bahwa log audit tunduk pada cadangan reguler. Idealnya, log harus disimpan pada server khusus dengan akses yang sangat ketat: jika server lain diretas, penyerang tidak akan dapat menghapus log untuk menyembunyikan keberadaannya (dan jalur yang diambil selama serangan).
Jangan ingat kredensial pengguna dalam cookie, kecuali jika pengguna meminta untuk melakukannya (kotak centang "Ingat saya" harus tidak dicentang secara default untuk menghindari kesalahan manusia).
Kemudahan penggunaan saran
<span/>
. Peramban tidak dapat mengisi bidang kata sandi dalam hal ini (setidaknya Firefox tidak dapat melakukannya), sehingga memaksa untuk keluar, lalu masuk dengan formulir biasa, diisi oleh peramban.sumber
bcrypt
dilakukan oleh orang-orang yang sangat berkualitas. Ini juga diuji, ditinjau, dll. Jadi tidak ada alasan untuk menerapkan hal yang sama sendiri. Ini seperti membuat algoritma kriptografi Anda sendiri untuk situs web Anda. * "Mengapa tidak md5 / sha1?": Lihat misalnya en.wikipedia.org/wiki/MD5#Securitybcrypt
jika memungkinkan. Jika tidak, gunakan beberapa jenis hash iterated lainnya.mysql_real_escape_string
. Jangan pernah menggunakan penggabungan string untuk membuat kueri Anda. Gunakan kueri yang disiapkan dan parametrized. Sebagian besar, jika tidak semua, driver DB untuk PHP mendukungnya. Jika Anda tidak tahu bagaimana melakukannya, meluangkan waktu belajar bagaimanaprepare
,bind
danexecute
menggunakan apa pun yang DB yang Anda gunakan. Ini satu - satunya cara pasti untuk melindungi diri Anda dari injeksi SQL. PDO mendukung ini.sumber
mysql_real_escape_string
adalah keamanan palsu - itu bukan jaminan. Kueri parametrized adalah.Gunakan hash satu arah asin (lebih disukai SHA512 menggunakan http://au2.php.net/manual/en/function.hash.php ) ... dengan cara itu, jika seseorang melakukan hack database Anda, bahkan jika mereka tahu garamnya , mereka tidak dapat mengekstrak kata sandi (tanpa tabel pelangi, yang akan menjadi terlalu lama untuk SHA512).
Gunakan HTTPS.
Jangan mengirim konfirmasi nama pengguna / kata sandi melalui email kembali ke pengguna ketika mereka mendaftar.
Jika Anda mengizinkan cookie untuk 'ingat saya' - tambahkan login tambahan untuk mengakses fungsi administrasi dan pengeditan profil.
Jika seorang pengguna salah kata sandi, jangan katakan mereka salah kata sandi (katakanlah mereka mendapat 'nama pengguna atau kata sandi salah' setiap saat) - dengan begitu, sedikit petunjuk tentang apa nama pengguna yang valid.
Coba dan terapkan nama layar versus login - dengan cara itu, lebih sedikit pengguna akan menampilkan nama login mereka pada daftar pengguna.
sumber
sumber
Berikut ini sedikit saran: pastikan cookie Anda tidak dapat diakses dengan JS untuk mencegah pencurian, lihat Melindungi Cookie Anda: Artikel HttpOnly oleh Jeff Atwood
sumber