Безопасное создание SQL-запросов в C # - PullRequest
16 голосов
/ 24 февраля 2012

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

Ответы [ 7 ]

22 голосов
/ 24 февраля 2012

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

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

Вот пример на C #

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();
5 голосов
/ 24 февраля 2012

По сути, не делайте этого

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, все запросы выполняются в последней форме.

1 голос
/ 24 февраля 2012

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

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

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();
         }
}
1 голос
/ 24 февраля 2012

Параметризация ваших запросов.

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

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

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

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

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

sqlCommand.CommandText = "select * from mytable where id = @id";
sqlCommand.Parameters.AddWithValue("@id", someVariable);
1 голос
/ 24 февраля 2012

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

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

0 голосов
/ 24 февраля 2012

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

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

0 голосов
/ 24 февраля 2012

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

А если нет, то хотя бы параметризовать ваши запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...