Bukan jawaban langsung tentang penyimpanan kata sandi, tetapi saya biasanya menggunakan setidaknya dua koneksi basis data saat membuat webapps - yang digunakan 99% dari waktu untuk kegiatan yang terkait dengan pengguna, dengan hak istimewa terbatas, dan yang lain digunakan untuk fungsionalitas 'admin' (hapus pengguna, dll.).
Dalam beberapa kasus, ketika saya menginstal paket orang lain, saya akan menginstal dua contoh ... contoh publik yang hanya memiliki akses database untuk melakukan hal-hal umum tipe pengguna, dan contoh kedua yang dibatasi IP untuk subnet lokal saya (mungkin bahkan pada mesin yang berbeda) yang harus digunakan untuk aktivitas jenis 'admin'. Tidak ada yang memiliki akses untuk memodifikasi tabel, dll, meskipun ... Saya lebih suka masuk melalui alat database asli daripada membiarkan webapp untuk menjalankan tugas pembaruan sendiri yang belum diperiksa.
Anda dapat mengambilnya lebih jauh lagi, dan menambahkan lebih banyak koneksi khusus untuk tugas yang diberikan ... sehingga tugas-tugas pembuatan & manajemen kata sandi pengguna melalui pengguna yang memiliki hak istimewa tambahan pada tabel pengguna, login memiliki privasi database untuk diautentikasi dan tidak banyak lagi. , dll.
Dengan cara ini, jika ada serangan injeksi sql, pada sebagian besar halaman web itu tidak dapat benar-benar melakukan sesuatu yang signifikan - tidak dapat melihat hash kata sandi, tidak dapat menambahkan pengguna admin baru (bukan bahwa mereka akan dapat melakukan Bagaimanapun juga), dll. Tetap tidak akan membantu jika mereka berhasil mendapatkan shell pada mesin Anda, tetapi itu akan memperlambatnya.