Я рассматриваю Perl-приложение на базе Linux, которое содержит обработчик входа с вездесущим
my $ sth = $ DB-> prepare ("ВЫБРАТЬ пароль из паролей, где userid = '$ userid'") или die; $ sth-> выполнить или умереть; ...
, где $ userid инициализируется из (небезопасного, нефильтрованного) пользовательского веб-ввода.
Хорошо известно, что в документации DBI рекомендуется изменить этот код для использования заполнителя "?" вместо '$ userid' для безопасности.
Этот код был изолирован на отключенном сетевом блоке, как есть, для проверки безопасности. Подобный код на интернет-сервере в конечном итоге будет взломан, так как теперь есть боты, которые сканируют эта уязвимость. Контроль доступа также неэффективен для защиты чего-либо важного, поскольку известные инъекции могут удалять базы данных, вставлять неверные данные или новых пользователей или обходить контроль доступа, чтобы разрешить доступ к веб-приложению.
Поскольку приложение можно настроить на использование PostgreSQL или MySQL, и были подняты вопросы о сравнительной уязвимости, я опробовал обе базы данных и протестировал каждую конфигурацию с некоторыми попытками внедрения SQL.
Под PostgreSQL ввод '; делать плохие вещи здесь; и здесь; будет аварийно завершить вход в систему cgi, как ожидалось, и выполнить плохие вещи.
Что было неожиданно, так это то, что MySQL противостоял этой атаке. Это заставило меня задуматься, была ли какая-то настройка для DBD :: MySQL или где-либо еще, которая ограничивала подготовку 1 оператором на вызов, или была устойчива к MySQL каким-либо другим способом.
Насколько я понимаю, MySQL вообще не устойчив к SQL-инъекциям.
Это не вопрос чисто техник устранения SQL-инъекций; об этом, возможно, см. Как избежать атак с использованием SQL-инъекций? .
Вопрос в том, является ли MySQL более устойчивым, чем PostgreSQL, к атакам с использованием SQL-инъекций под DBI-интерфейсом PERL, и почему это может иметь место?