Подтвердить что ты не робот

Генерирование SQL-запросов безопасно в С#

Какой самый безопасный способ генерации SQL-запросов в С#, включая очистку пользовательского ввода, чтобы он был безопасным от инъекции? Я ищу использовать простое решение, для которого не нужны внешние библиотеки.

4b9b3361

Ответ 1

Используйте параметры Sql:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter(v=vs.80).aspx

Здесь пример в С#

SqlCommand tCommand = new SqlCommand();
tCommand.Connection = new SqlConnection("YourConnectionString");
tCommand.CommandText = "UPDATE players SET name = @name, score = @score, active = @active WHERE jerseyNum = @jerseyNum";

tCommand.Parameters.Add(new SqlParameter("@name", System.Data.SqlDbType.VarChar).Value = "Smith, Steve");
tCommand.Parameters.Add(new SqlParameter("@score", System.Data.SqlDbType.Int).Value = "42");
tCommand.Parameters.Add(new SqlParameter("@active", System.Data.SqlDbType.Bit).Value = true);
tCommand.Parameters.Add(new SqlParameter("@jerseyNum", System.Data.SqlDbType.Int).Value = "99");

tCommand.ExecuteNonQuery();

Ответ 2

По существу не делайте этого

SqlCommand command = new SqlCommand(MyConnection);
command.CommandText = "Select * From MyTable Where MyColumn = '" + TextBox1.Text + "'"
...

do

SqlCommand command = new SqlCommand(MyConnection);
command.CommandText = "Select * From MyTable Where MyColumn = @MyValue";
command.Parameters.AddWithValue("MyValue",TextBox1.Text);
...

В принципе никогда не создавайте свою команду sql непосредственно из пользовательского ввода.

Если вы используете ORM, например EntityFrameworks/POCO, все запросы выполняются в последней форме.

Ответ 3

Первое правило состоит в том, чтобы убедиться, что вы используете параметризованные запросы/команды. В принципе, не динамически строить строку sql, которая включает в себя то, что пользователь вводит на страницу.

Если вы используете ORM (EF, L2S, Nhib), это обычно обрабатывается в большинстве случаев, потому что большинство из них выполняют параметризованные запросы.

Ответ 4

Параметрируйте свои запросы.

Если вы создаете какой-то TSQL, который строит какой-то другой динамический TSQL - то используйте описанную технику

Что означает "параметризация"?

Смотрите, не используйте что-то вроде этого:

sqlCommand.CommandText = "select * from mytable where id = "+someVariable;

используйте это:

sqlCommand.CommandText = "select * from mytable where id = @id";
sqlCommand.Parameters.AddWithValue("@id", someVariable);

Ответ 5

Использовать параметризованные запросы.

Простой пример.

var sql = "SELECT * FROM MyTable WHERE MyColumn = @Param1";
using (var connection = new SqlConnection("..."))
using (var command = new SqlCommand(sql, connection))
{
    command.Parameters.AddWithValue("@Param1", param1Value);
    return command.ExecuteReader();
}

Более подробный пример.

protected void btnGoodAddShipper_Click(object sender, EventArgs e)
{
   string connStr = c
      "Server=(local);Database=Northwind;Integrated Security=SSPI";

   // this is good because all input becomes a
   // parameter and not part of the SQL statement
   string cmdStr =
      "insert into Shippers (CompanyName, Phone) values (" +
      "@CompanyName, @Phone)";

   using (SqlConnection conn = new SqlConnection(connStr))
      using (SqlCommand cmd = new SqlCommand(cmdStr, conn))
         {
             // add parameters
             cmd.Parameters.AddWithValue
                ("@CompanyName", txtCompanyName.Text);
             cmd.Parameters.AddWithValue("@Phone", txtPhone.Text);

             conn.Open();
             cmd.ExecuteNonQuery();
         }
}

Ответ 6

Используя DBML и LINQ, чтобы обрабатывайте его для вас. Многие люди работали над тем, чтобы эти проблемы были хорошо смягчены.

И если не по крайней мере параметризировать ваши запросы.

Ответ 7

Собственное имя для DBML - linq2sql или расширенная версия называется структурой сущности. Эти технологии предоставляются Microsoft и хорошо интегрированы с визуальной студией. Не требует дополнительных библиотек.

Довольно стабильные продукты.