在C#中生成SQL查询最安全的方法是什么,包括清理用户输入以便注入安全?我希望使用一个不需要外部库的简单解决方案。
答案 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)
答案 6 :(得分:0)
DBML的正确名称是linq2sql,或者高级版本称为实体框架。这些技术由Microsoft提供,并与visual studio完美集成。不需要额外的库。
相当稳定的产品..