根据字典生成类似于WHERE语句的字符串。

13 浏览
0 Comments

根据字典生成类似于WHERE语句的字符串。

我知道我们永远不应该这样做:

string select = "SELECT * FROM table1 ";
string where = "WHERE Name = '" + name + "' ";
string sql = select + where;
//通过ADO.NET执行sql语句

因为SQL注入的原因,因为name可能包含字符',还有其他100个原因。但是现在我必须做类似的事情。我有一个数据看起来像这样的Dictionary

   键(string)      值(object)
    "Name"              "Bob"            //字符串
    "ID"              10092L             //长整型 
    "Birthday"      1980-05-07 00:00:00  //日期时间
    "Salary"          5000.5m            //十进制数
//还有其他一些,键是字符串,值是字符串/长整型/整型/日期时间/十进制数

我想要一种简单的方法,将字典中的所有项收集在一个String中,就像一个where语句一样:

Name = 'Bob' and ID = 10092 and Birthday = '1980-05-07 00:00:00' and Salary = 5000.5

字符串和日期时间被'引起来,但请注意,Name可能是O'Neal。有没有简单的实现?输入字典,返回字符串作为结果。

编辑请注意,我想要的是字符串,我不打算执行它,参数化命令对此没有帮助。我只想要一个看起来像完美安全的WHERE语句的字符串。

0
0 Comments

问题的出现原因:在将字典转化为类似WHERE语句的字符串时,如果字典中的值包含特殊字符,如单引号,可能会导致生成的SQL代码出错或者容易受到SQL注入攻击。

解决方法:使用预处理语句(Prepared Statements)来解决这个问题。预处理语句可以将参数与SQL语句分离,从而避免了特殊字符对SQL代码的影响或者注入攻击。

以下是一个简单的解决方法示例:

string results = string.Join(" and ", myDict.Select(x => x.Key + " = @" + x.Key));
var command = new SqlCommand("SELECT * FROM table WHERE " + results, connection);
foreach (var entry in myDict)
{
    command.Parameters.AddWithValue("@" + entry.Key, entry.Value);
}

这个示例中,首先使用`string.Join`函数将字典中的键值对拼接成一个字符串,每个键值对之间使用" and "连接。然后,创建一个带有参数的SQL命令对象`SqlCommand`,并将拼接好的字符串作为SQL查询的一部分。最后,使用`command.Parameters.AddWithValue`方法将字典中的值作为参数添加到SQL命令对象中。

通过使用预处理语句和参数化查询,可以确保生成的SQL代码对特殊字符具有容错性,同时有效地防止SQL注入攻击的风险。

0
0 Comments

问题的原因是在生成一个类似于WHERE语句的字符串时,如果字符串中包含用户输入的内容,可能会出现问题。如果字符串中的内容不是用户输入的,那么这个问题就不存在。

为了解决这个问题,可以尝试使用类似于name = name.Replace("'", "''")的方法。通过将所有的单引号替换为双单引号,可以防止出现问题描述中提到的类型问题。另一种方法是移除所有的单引号。

然而,最好的解决方法是使用查询参数。ADO很好地支持这些参数,这样可以彻底消除注入攻击的可能性。

强烈赞成这个建议的后半部分。

0
0 Comments

问题的出现原因:

在数据库查询中,经常会遇到需要将字符串值作为WHERE语句的一部分的情况。然而,由于字符串中可能包含特殊字符,例如单引号,这可能会导致查询语句出错。为了避免这个问题,需要对字符串进行转义处理。

解决方法:

为了解决这个问题,作者编写了一个函数SqlString,用于将字符串转换为符合WHERE语句要求的格式。该函数的作用是将字符串中的单引号替换为两个单引号,并在字符串两端添加单引号,以确保字符串的正确性。通过使用这个函数,可以避免手动处理字符串中的特殊字符,节省了时间和精力。

代码示例:

// replace things like:
// O'Keefe with 'O''Keefe'
// make sure you don't call this twice!
static public string SqlString(string strInputSQL)
{
    string strOut;
    strOut = strInputSQL;
    strOut = strOut.Replace("'", "''");
    strOut = "'" + strOut + "'";
    return strOut;
}

使用示例:

string sql = "SELECT * FROM FOO WHERE Name LIKE " + SqlString(myvalue);

通过编写这个函数,作者提供了一种简便的方法来生成符合WHERE语句要求的字符串。通过使用这个函数,可以确保字符串中的特殊字符得到正确处理,避免了手动处理字符串的麻烦。这种方法可以节省时间和精力,并且通过在整个项目中一致地使用这个函数,可以避免重复解决同样的问题,提高了效率。

0