在C#中安全地生成SQL查询

时间:2012-02-24 15:18:18

标签: c# sql

在C#中生成SQL查询最安全的方法是什么,包括清理用户输入以便注入安全?我希望使用一个不需要外部库的简单解决方案。

7 个答案:

答案 0 :(得分:22)

使用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();

答案 1 :(得分:5)

本质上不要这样做

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

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

基本上不会直接从用户输入构建你的sql命令。

如果您使用ORM,例如EntityFrameworks / POCO,则所有查询都以后一种形式完成。

答案 2 :(得分:1)

第一个经验法则是确保使用参数化查询/命令。基本上不要动态构建包含用户输入到页面中的内容的sql字符串。

如果您在ORM(EF,L2S,Nhib)上使用,通常会在大多数情况下处理,因为大多数情况都会运行参数化查询。

答案 3 :(得分:1)

参数化您的查询。

如果你构建了一些构建其他动态TSQL的TSQL - then use some described technique

“参数化意味着什么?”

看,不要使用这样的东西:

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

使用它:

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

答案 4 :(得分:1)

使用参数化查询。

简单示例。

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();
         }
}

答案 5 :(得分:0)

使用DBMLLINQ为您处理。很多人都在努力确保这些问题得到很好的缓解。

如果不是至少参数化您的查询。

答案 6 :(得分:0)

DBML的正确名称是linq2sql,或者高级版本称为实体框架。这些技术由Microsoft提供,并与visual studio完美集成。不需要额外的库。

相当稳定的产品..