безопасно ли использовать динамический SQL с параметрами? Если нет, с какими проблемами безопасности это может быть связано? - PullRequest
5 голосов
/ 12 января 2011

Например, это код, который я использую:

String commandString = "UPDATE Members SET UserName = @newName , AdminLevel = @userLevel WHERE UserID = @userid";
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlconnectionstring"].ConnectionString))
{
    SqlCommand cmd = new SqlCommand(commandString, conn);
    cmd.Parameters.Add("@newName", newName);
    cmd.Parameters.Add("@userLevel", userLevel);
    cmd.Parameters.Add("@userid", userid);
    conn.Open();
    cmd.ExecuteReader();
    Reader.Close();
}

Ответы [ 3 ]

7 голосов
/ 12 января 2011

Этот код выглядит хорошо.Параметризация - это лучший способ, в отличие от конкатенации пользовательских значений в специальном SQL-выражении, которое может открыть для вас атаки SQL-инъекций.Это также может помочь с повторным использованием плана выполнения.

Единственное, что я хотел бы добавить, - я предпочитаю явно определять тип данных и размеры параметров.Например, если вы этого не сделаете, то, например, все строковые значения будут переданы в базу данных как NVARCHAR вместо VARCHAR.Поэтому я хотел бы быть явным.

4 голосов
/ 12 января 2011

Это безопасно против внедрения SQL, потому что оно параметризовано.Другие проблемы безопасности, такие как обеспечение того, чтобы @userid не был подделан, являются отдельными проблемами безопасности, которые должны рассматриваться на других уровнях вашего приложения.

2 голосов
/ 12 января 2011

Это все еще статическая строка запроса.Это не совсем «динамический» sql, пока вы не создадите части строки на лету - что-то вроде этого:

var sql = "SELECT columns FROM Table WHERE 1=1";
if (!string.IsNullOrEmpty(txtName.Text)) sql += " AND Name LIKE '%' + @Name + '%'";
if (!string.IsNullOrEmpty(txtDesc.Text)) sql += " AND CONTAINS(DESCRIPTION, @description)";

Но даже в этом случае, это все еще «безопасно» в смысле внедрения SQL, покавы продолжаете использовать параметры для каждой части запроса, которая создается при вводе пользователем.

...