C# 转义sql字符串的简单方法?
在我的代码中,到处都有C# 转义sql字符串的简单方法?,c#,.net,sql,ado.net,C#,.net,Sql,Ado.net,在我的代码中,到处都有 command.Parameters.Add("@name", DbType.String).Value = name; 有没有更简单的方法?我很想做像这样的事情 command.command.CommandTextFn("insert into tbl(key,val) values(?, ?);", key, value); 并让它确定键/值是字符串还是int。我不介意是否必须使用{0}而不是?使用参数化查询可以保护您的系统免受SQL注入攻击 当然,您可以处理S
command.Parameters.Add("@name", DbType.String).Value = name;
有没有更简单的方法?我很想做像这样的事情
command.command.CommandTextFn("insert into tbl(key,val) values(?, ?);", key, value);
并让它确定键/值是字符串还是int。我不介意是否必须使用
{0}
而不是?
使用参数化查询可以保护您的系统免受SQL注入攻击
当然,您可以处理SQL转义,但是为什么要麻烦呢?你可能会犯错误,然后在为时已晚的时候发现它
请阅读本文,解释使用参数化查询的优缺点
投入时间改进其他代码。您做的是正确的-使用参数是重用代码和保护您免受SQL注入攻击的最佳解决方案。。它没有坏,所以不要修理它
如果它真的让你感到不舒服(而且不应该),那么你可能可以用一种扩展方法做一些创造性的事情,让你把那一点代码包装成更小的东西,但实际上有更好的事情需要担心。使用这种方法:
您可以将其与扩展方法结合使用:
public static SqlCommand CreateCommand(this SqlConnection connection, string command, string[] names, object[] values )
{
if (names.Length != values.Length)
{
throw new ArgumentException("name/value mismatch");
}
var cmd = connection.CreateCommand();
cmd.CommandText = command;
for (int i = 0; i < names.Length; ++i )
{
cmd.Parameters.AddWithValue(names[i], values[i]);
}
return cmd;
}
尝试用linq to sql替换此类调用。您将在编译时获得类型检查,不再需要它来转义字符串和考虑sql注入 样本:
Dim newCustomer = New Customer With {.CustomerID = "MCSFT", .CompanyName = "Microsoft", .ContactName = "John Doe", .ContactTitle = "Sales Manager", .Address = "1 Microsoft Way", .City = "Redmond", .Region = "WA", .PostalCode = "98052", .Country = "USA", .Phone = "(425) 555-1234", .Fax = Nothing}
db.Customers.Add(newCustomer)
db.SubmitChanges()
创建一组采用参数名称和值的通用函数。包装并隐藏所有样板代码。不要这样做!它使您容易受到SQL注入攻击!您已经使用的方式可能是最好的……我不认为他希望使用未经参数化的查询,只是一种更简单的方式来构建它们。?当人们试图以“不是一个真正的问题”来结束这件事时。。。对我来说,它看起来像一个。我也发现multiple AddWithValue调用接口过于冗长,令人恼火,因此我很高兴看到帮助器方法的建议,以使其平滑。您有一个输入错误,应该是
names[I],values[I]
(由于该死的6个字符最小限制,无法编辑)
var command = connection.CreateCommand( "insert into tbl (key,val) values(@key,@val)",
new string[] { "@key", "@val" },
new object[] { key, val } );
Dim newCustomer = New Customer With {.CustomerID = "MCSFT", .CompanyName = "Microsoft", .ContactName = "John Doe", .ContactTitle = "Sales Manager", .Address = "1 Microsoft Way", .City = "Redmond", .Region = "WA", .PostalCode = "98052", .Country = "USA", .Phone = "(425) 555-1234", .Fax = Nothing}
db.Customers.Add(newCustomer)
db.SubmitChanges()