Сценарий A:
SqlConnection con = new SqlConnection(myConnString);
SqlDataAdapter adp = new SqlDataAdapter("EXEC spGetUserInfo 42", con);
DataSet ds;
adp.Fill(ds);
Сценарий B:
SqlConnection con = new SqlConnection(myConnString);
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandText = "spGetUserInfo";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@UserID", 42));
SqlDataAdapter adp = new SqlDataAdapter(cmd);
DataSet ds;
adp.Fill(ds);
Вопрос
В обсуждении того, как защитить SqlServer от атак SQL-инъекций отдельно от модификации кода основного приложения, вызывающего базу данных, был поднят вопрос о том, можно ли настроить SqlServer так, чтобы он просто не выполнял хранимые процессы, написанные только в сценарии A разрешение запросов на выполнение, написанных в соответствии со сценарием B. Теория заключается в том, что сценарий A будет уязвим для внедрения, если базовое приложение не выполнит проверку ввода, что позволит что-то вроде «EXEC spGetUserInfo 42; отбросить базу данных foo; -» для возможного будет выполняться, в то время как сценарий B просто не будет выполнен, когда SqlServer не сможет преобразовать "42; отбросить базу данных foo; -" в целое число.
Можно ли настроить SqlServer так, чтобы он не выполнял хранимые процедуры, вызываемые в соответствии со сценарием A?