C# SQL select参数包含撇号
我对C# SQL select参数包含撇号,c#,sql,sql-server,parameters,C#,Sql,Sql Server,Parameters,我对productName参数有问题,该参数包含字符串AcrBuye's something,在本例中,我只需要检查数据库中是否存在productName和SKU 我犯了一个错误 “s”附近的语法不正确。 字符串“”后的未闭合引号 我尝试了一些转义字符的东西,也使用了like,但没有效果 这是我的代码: String query = "SELECT * FROM " + toDB + ".dbo.Products WHERE Name like '" + productName.Replace(
productName
参数有问题,该参数包含字符串AcrBuye's something
,在本例中,我只需要检查数据库中是否存在productName和SKU
我犯了一个错误
“s”附近的语法不正确。字符串“”后的未闭合引号 我尝试了一些转义字符的东西,也使用了like,但没有效果 这是我的代码:
String query = "SELECT * FROM " + toDB + ".dbo.Products WHERE Name like '" + productName.Replace("'","\'") + "' and SKU='" + newSKU+"'";
SqlConnection c = new SqlConnection(cs);
SqlCommand command = new SqlCommand(query, c);
c.Open();
object o = (object)command.ExecuteScalar();
c.Close();
这是我知道的唯一一个SQL注入示例,谢谢
非常感谢您对我的帮助:
这是实际运行良好的代码:
string commandText = "SELECT * FROM " + toDB + ".dbo.Product WHERE Name= @prodName and SKU=@sku;";
using (SqlConnection c = new SqlConnection(cs))
{
SqlCommand command = new SqlCommand(commandText, c);
command.Parameters.Add("@prodName", SqlDbType.VarChar);
command.Parameters["@prodName"].Value = productName;
command.Parameters.Add("@sku", SqlDbType.VarChar);
command.Parameters["@sku"].Value = newsku;
c.Open();
object o = (object)command.ExecuteScalar();
c.Close();
if (o != null)
result = true;
}
对于SQL,您需要使用双引号
String query = "SELECT * FROM " + toDB + ".dbo.Products WHERE Name like '" + productName.Replace("'","''") + "' and SKU='" + newSKU+"'";
但是,这会受到SQL注入攻击。请改为使用参数(作为奖励,您不需要跳过撇号):
您应该在查询中使用参数,这样就不需要转义特殊字符,如:
using (SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder())
{
toDB = sqlCommandBuilder.QuoteIdentifier(toDB);
}
string query = "SELECT * FROM " + toDB + ".dbo.Products WHERE Name like @productName and SKU = @SKU";
using (SqlConnection c = new SqlConnection(cs))
using (SqlCommand command = new SqlCommand(query, c))
{
c.Open();
command.Parameters.Add(new SqlParameter("@productName", SqlDbType.VarChar) { Value = productName });
command.Parameters.Add(new SqlParameter("@SKU", SqlDbType.VarChar) { Value = SKU });
//or command.Parameters.AddWithValue("@productName", productName);
object o = (object)command.ExecuteScalar();
}
由于您使用的是toDB
(可能来自用户输入),因此应使用转义,因为您无法传递表名/列名等参数
还有一件事是将using
语句与那些实现IDisposable
接口的对象一起使用。在SqlConnection
的情况下,将语句封装在using
中将确保连接在作用域结束时关闭。在上述情况下,连接将在执行命令后关闭d、 即使是在例外情况下
创建SQL查询的字符串连接对SQL注入是开放的。请阅读更多信息并查看再次感谢所有人,这是工作代码:
string commandText = "SELECT * FROM " + toDB + ".dbo.Product WHERE Name= @prodName and SKU=@sku;";
using (SqlConnection c = new SqlConnection(cs))
{
SqlCommand command = new SqlCommand(commandText, c);
command.Parameters.Add("@prodName", SqlDbType.VarChar);
command.Parameters["@prodName"].Value = productName;
command.Parameters.Add("@sku", SqlDbType.VarChar);
command.Parameters["@sku"].Value = newsku;
c.Open();
object o = (object)command.ExecuteScalar();
c.Close();
if (o != null)
result = true;
}
-您不应该将SQL语句连接在一起-使用参数化查询来避免SQL注入,而不是试图转义它,只需将撇号设置为双撇号“”…SQL将其视为单个。您知道SQL注入,但不知道避免SQL注入的相同模式也会删除您的pr撇号的问题使用SELECT*检查记录是否存在并不是一个好的做法。我会尝试在查询中使用IF EXISTS。您应该展示一个带有sql参数的示例,因为这不仅可以隐式修复此问题,而且还可以修复提到的sql注入漏洞。有很多示例可用我认为不应该扩大这个问题的范围。如果没有显示正确的方式,你就无意中助长了这个坏习惯,从而打击OP和未来的读者。
产品
和sku
不确定是谁给了+2
投票权。但是Sql Server中的参数期望@
你应该在下面阅读wing@DJKRAZE,您实际上不需要SQLParameter的@
前缀(当然,您在查询中需要它)。这很混乱,而且没有文档记录,但我最近不得不维护一些代码,这些代码始终没有使用@prefix,而且运行良好。
string commandText = "SELECT * FROM " + toDB + ".dbo.Product WHERE Name= @prodName and SKU=@sku;";
using (SqlConnection c = new SqlConnection(cs))
{
SqlCommand command = new SqlCommand(commandText, c);
command.Parameters.Add("@prodName", SqlDbType.VarChar);
command.Parameters["@prodName"].Value = productName;
command.Parameters.Add("@sku", SqlDbType.VarChar);
command.Parameters["@sku"].Value = newsku;
c.Open();
object o = (object)command.ExecuteScalar();
c.Close();
if (o != null)
result = true;
}