Це не пряма відповідь про збереження паролів, але я, як правило, використовую принаймні два підключення до бази даних при створенні веб-сайтів - один використовується 99% часу для діяльності, пов’язаної з користувачем, з обмеженими привілеями, а інший використовується для функцій 'адміністратора' (видалити користувачів тощо).
У кількох випадках, коли я встановлюю чужий пакет, я встановлю два екземпляри ... загальнодоступний екземпляр, який має лише доступ до бази даних, щоб робити загальні користувальницькі речі, і другий екземпляр, на який обмежено IP мою локальну підмережу (можливо, навіть на іншій машині), яку потрібно використовувати для будь-яких видів "адміністратора". Жоден з них не має доступу до зміни таблиць тощо, хоча ... Я б швидше зайшов за допомогою інструментів рідної бази даних, ніж дозволити webapp виконувати власні завдання оновлення, які не були перевірені.
Ви можете взяти це ще більше, і додавати більше з'єднань спеціально для заданих завдань ... тож завдання зі створення та керування паролем переходять через користувача, який має додаткові привілеї в таблицях користувачів, увійти в систему, має привідні бази даних для автентифікації та не багато іншого тощо.
Таким чином, якщо нападає sql-ін'єкційна атака, на більшості веб-сторінок вона дійсно не може зробити нічого істотного - не може бачити хеші паролів, не може додати нового користувача адміністратора (не те, що вони зможуть зробити все одно) і т. д. Це все одно не допоможе, якщо їм вдасться отримати оболонку на вашій машині, але це сповільнить їх.