使用SQL保存文本时如何解决'(引用)问题

时间:2011-04-12 14:41:00

标签: asp.net sql

我有一个使用ASP.NET C#保存到SQL数据库的文本框。

问题是使用引号,例如使用像他这样的单词。保存时,我收到SQL错误。

从经验到解决问题,我使用replace命令查找所有引号的出现并用另一个字符替换它们。然后,如果我要读取数据库和之前保存的文本,我会再次替换。

这样做有好处吗?或者你仍然需要使用这种“旧”的方式。

4 个答案:

答案 0 :(得分:6)

使用参数化查询。

使用replace是危险的,可能导致无意的SQL注入漏洞。

答案 1 :(得分:3)

始终使用参数化查询。永远不要将字符串连接在一起(使用未经过清理的输入信息)来动态创建SQL。您可能会受到SQL注入攻击的攻击。<​​/ p>

仔细阅读以下指南:

http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson06.aspx

当您了解以下漫画时,您已准备好编码:

http://xkcd.com/327/

答案 2 :(得分:0)

正如其他答案所指出的,此处的正确答案是使用参数化查询

然而,这有时是不可能的。在这些情况下,你最好将引号加倍:

String str = "he's";
str = str.Replace("'", "''");

答案 3 :(得分:0)

有两种方法可以解决这个问题:

  1. 使用参数化查询,例如在http://www.csharp-station.com/Tutorials/AdoDotNet/Lesson06.aspx中 - 如果您担心
  2. ,这也有助于避免基本的SQL注入
  3. 创建2个新函数,一个用于将每个撇号加倍,以便将其正确保存到数据库中,另一个用于从数据库中检索数据时删除额外的撇号。
  4. 我会推荐第一种方法,因为在我看来它更清洁(更安全)。如果您在ASP.NET中使用C#,则可以执行以下示例中的操作:

    string clientName = "Test client";
    SqlCommand sqlCommand = new SqlCommand("SELECT COUNT(*) FROM Client WHERE UPPER(ClientName) = UPPER(@ClientName)", connection);
    sqlCommand.Parameters.AddWithValue("@ClientName", clientName);