Хранимые процедуры обычно выигрывают для безопасности. Упрощение отношений между вашим приложением и базой данных уменьшает количество мест, где вы можете иметь ошибки; ошибки в коде, который связывает бизнес-логику с базой данных, как правило, являются проблемами безопасности. Таким образом, ваш администратор БД не ошибается в привязке вещей к хранимым процедурам.
Еще одним преимуществом блокировки приложения для хранимых процедур является то, что подключение к базе данных стека приложений может иметь свои привилегии, привязанные к конкретным вызовам хранимых процедур, и ничего более.
Преимущество участия администратора баз данных в логике безопасности для вашего приложения состоит в том, что различные функции и роли приложения могут быть разделены в базе данных вплоть до представлений, так что даже если требуются динамический SQL и универсальные операторы выбора, ущерб от уязвимость SQL может быть ограничена.
С другой стороны, это, конечно, потеря гибкости. Очевидно, что ORM будет быстрее разрабатываться, чем постоянное согласование с администратором баз данных по параметрам хранимой процедуры. И, по мере того как давление на эти хранимые процедуры возрастает, становится все более вероятным, что сами процедуры будут прибегать к динамическому SQL, который будет столь же уязвим, что и SQL, создаваемый приложением, для атаки.
Здесь есть счастливая середина, и вы должны попытаться найти ее. Недавно я работал над проектами, которые были спасены от довольно ужасных проблем с внедрением SQL, потому что администратор БД тщательно настроил базу данных, ее соединения и хранимые процедуры для «наименьших привилегий», чтобы любой пользователь базы данных имел доступ только к тому, что он нужно было знать.
Очевидно, что при написании кода SQL в логике приложения убедитесь, что вы последовательно используете параметризованные подготовленные операторы, что вы дезинфицируете свой ввод, что вы помните о интернационализированном вводе (есть много, много способов сказать одинарную кавычку по HTTP), и вы помните, как ведет себя ваша база данных, когда входные данные слишком велики для ширины столбцов.