2011-05-05 104 views
1

我保持一段代码,串接SQL查询:和addslashes /逃避单引号在.NET

string sql = "SELECT* FROM table WHERE column = '" + value + "'"; 

现在事实证明,如果包含 characted它会破坏SQL服务器文本语句。我搜索了一下类似PHP addslashes的方法,但没有成功。有Regex.Escape但它并没有伎俩。是否有任何其他的方式来解决这个问题,除了呼吁上串?:

string sql = "SELECT* FROM table WHERE column = '" + value.Replace("'", "''") + "'"; 

由于更换方法, 帕维尔

+4

你绝对_have_来连接?你不能使用参数吗? – 2011-05-05 14:28:11

+1

需要做大量重构...... – dragonfly 2011-05-05 14:28:38

+2

在我们开始编码时,为什么我们需要一个“首先没有危害”的誓言类型?这种*重构*将极大地帮助您在将来。现在花这些周期来杀死这些技术债务。 – 2011-05-05 14:34:16

回答

3

我会建议不要使用,你应该使用的参数字符串连接,而不是看下面的例子

// 1. declare command object with parameter 
SqlCommand cmd = new SqlCommand(
    "select * from Customers where city = @City", conn); 
// 2. define parameters used in command object 
SqlParameter param = new SqlParameter(); 
param.ParameterName = "@City"; 
param.Value   = inputCity; 
// 3. add new parameter to command object 
cmd.Parameters.Add(param); 
8

您应该使用SqlCommandSqlParameter而不是构建查询,你现在是。正如其他人所说,你正在做的事情让你对注入攻击敞开大门。

如果你不能这么做,那么正如你所说,替换是一个很好的选择。

3

您正在打开您的代码到SQL Injection攻击 - 使用参数化查询。

作为一种奖励,这种逃避罪恶将不再需要,因为图书馆会为你照顾它们。

1

而这是通常推荐使用SQL参数的一个关键原因。如果这不是一个选项,我认为String.Replace()是一样好的任何其他方法。