Я создаю SqlCommand с именем хранимой процедуры, указанным пользователем в UserStoredProcedureName, используя следующий код:
new SqlCommand(UserStoredProcedureName, connection)
{ CommandType = CommandType.StoredProcedure }
Строка, предоставленная пользователем в UserStoredProcedureName, не проверяется. Может ли пользователь указать только имя хранимых процедур в базе данных? Может ли пользователь выполнить атаку с использованием SQL-инъекции, создав вредоносное имя хранимой процедуры?
Например:
UserStoredProcedureName = "SELECT * FROM USERS";





Атака sql-инъекции не произойдет с самой хранимой процедурой, но может произойти с предоставленными аргументами / параметрами. Есть хорошая статья, которая немного объясняет.
Например, вы можете вызвать SP_MYPROC, что нормально, но я могу ввести по первому параметру:
;drop table users
И нет, нет никакой "проверки" для хранимых процедур, кроме отказа, если они не найдены.
В общем, я думаю, что это идея очень плохо, позволяющая кому-то писать в тексте, который вы затем выполняете как оператор, особенно если у логина есть доступ на запись. Если вы хотите быть в большей безопасности, вы можете создать раскрывающееся меню, запрашивая доступные хранимые процедуры, а затем, когда вы запускаете одну из них, вы можете проверить соответствие 1 = 1 между тем, что запрашивается для запуска, и доступными именами процедур.
Но чтобы разрешить текст произвольной формы на стороне параметров, это то, где он быстро двинется на юг.
Я знаком только с явным указанием параметров, например:
sqlcommand.parameters.addwithvalue(x,y);
Но в этом случае имя и параметры процедуры жестко запрограммированы.
Вы не должны позволять внешнему коду указывать имя хранимой процедуры. Причины: хранимой процедурой может быть sp_executesql, который может запускать все, что вы указываете в качестве первого параметра. Это также может быть xp_cmdshell или аналогичный.
Итак: вы все равно должны контролировать имя входной хранимой процедуры через белый список. Если имя взято из вашего собственного кода, это не должно быть проблемой, и в таком сценарии не принято заносить в белый список.
Примечание: если хранимая процедура внутренне использует EXEC (@sql) или EXEC sp_executesql @sql, она все равно может представлять атаку с использованием SQL-инъекции, в зависимости от того, может ли @sql содержать вредоносный непараметрический SQL. Обратите внимание, что sp_executesql - это разработан, чтобы позволить вам полностью параметризовать динамический SQL, чтобы избежать атак SQL-инъекций даже внутри SQL, сгенерированного внутри SQL.
Ты это пробовал?