Не прямой ответ о хранении паролей, но я обычно использую по крайней мере два соединения с базой данных при создании веб-приложений - одно используется 99% времени для действий, связанных с пользователями, с ограниченными привилегиями, а другое используется для функциональности «администратора» (удалить пользователей и т. д.).
В некоторых случаях, когда я устанавливаю чей-либо пакет, я устанавливаю два экземпляра: общедоступный экземпляр, у которого есть только доступ к базе данных для выполнения общих действий пользовательского типа, и второй экземпляр, который ограничен IP-адресами. моя локальная подсеть (возможно, даже на другом компьютере), которая должна использоваться для любых действий типа «администратор». Ни один из них не имеет доступа к изменению таблиц и т. Д., Хотя ... Я бы лучше пошел через нативные инструменты базы данных, чем позволял бы веб-приложению запускать свои собственные задачи обновления, которые не были проверены.
Вы можете пойти еще дальше и добавить больше соединений специально для определенных задач ... так что задачи создания пользователя и управления паролем проходят через пользователя, у которого есть дополнительные привилегии для пользовательских таблиц, у входа в систему есть привилегии базы данных для аутентификации и не более того. , и т.д.
Таким образом, если есть атака с использованием SQL-инъекции, на большинстве веб-страниц она не может сделать ничего существенного - не может видеть хэши паролей, не может добавить нового пользователя-администратора (не то, что они могли бы сделать). в любом случае) и т. д. Это все равно не поможет, если им удастся получить оболочку на вашем компьютере, но это замедлит их.