Какой самый безопасный способ генерации SQL-запросов в С#, включая очистку пользовательского ввода, чтобы он был безопасным от инъекции? Я ищу использовать простое решение, для которого не нужны внешние библиотеки.
Генерирование SQL-запросов безопасно в С#
Ответ 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 и хорошо интегрированы с визуальной студией. Не требует дополнительных библиотек.
Довольно стабильные продукты.