Вы должны быть осторожны с вашими определениями. «Параметры» могут означать несколько вещей; Например, параметры хранимой процедуры не защищают вас сами по себе. Чтобы использовать Java в качестве примера:
sql = "exec proc_SearchForUser '" + userNameToSearch + "'";
не лучше и не хуже сырых
sql = "SELECT * FROM Users WHERE userName = '" + userNameToSearch + "'";
и так же восприимчив к имени пользователя
';DROP TABLE users;--
Параметризованные запросы, с другой стороны, безопасны. Они могут выглядеть как
PreparedStatement statement = con.prepareStatement("SELECT * FROM Users WHERE userName = ?");
или действительно
PreparedStatement statement = con.prepareStatement("exec proc_SearchForUser ?");
Причина, по которой это безопасно, заключается в том, что когда вы вводите значение ... используя, скажем,
statement.setString(1, userName);
тогда строка - даже такая, как "'; DROP TABLE users; -" - будет должным образом экранирована ядром БД и будет обезврежена.
Это все еще возможно испортить - например, если ваша хранимая процедура просто строит строку SQL внутри и выполняет ее, доверяя вводу, - но подготовленные операторы с параметрами означают, что никакие неэкранированные данные никогда не попадут в БД сервер, полностью отключив этот вектор атаки.