【问题标题】:Incorrect syntax near ''. Unclosed quotation mark after the character string ' ''' 附近的语法不正确。字符串 ' ' 后的非闭合引号
【发布时间】:2011-02-10 18:23:53
【问题描述】:

我只是想知道是否有人可以在这里为我指出正确的方向,我想我已经看了太久了,所以看不到错误。

以下代码:

SqlCommand updateStyle = new SqlCommand("UPDATE [Lorenz].[dbo].[Layout] SET [bgColour] = '" + bgColour + "' , [textColour] = '" + txtColour + "WHERE <[LoweredUserName] ='" + currentUser + "' ", connection);
updateStyle.ExecuteNonQuery();

给出错误:

“admin”附近的语法不正确。 字符串' '后面的非闭合引号。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    您确实应该使用 SQL 参数。它不仅有助于保护您的应用免受 SQL 注入攻击,还可以让 SQL 语法错误更容易被发现。

    SqlCommand updateStyle = new SqlCommand("UPDATE [Lorenz].[dbo].[Layout] SET [bgColour] = @bgColour, [textColour] = @textColour WHERE <[LoweredUserName] = @currentUser", connection);
    updateStyle.Parameters.Add(new SqlParameter("@bgColour", bgColour));
    updateStyle.Parameters.Add(new SqlParameter("@textColour", textColour));
    updateStyle.Parameters.Add(new SqlParameter("@currentUser", currentUser));
    updateStyle.ExecuteNonQuery();
    

    【讨论】:

    • 谢谢,我现在就实现这个:)
    【解决方案2】:
    [textColour] = '" + txtColour + "WH
    

    缺少单引号:

    [textColour] = '" + txtColour + "'WH
    

    编辑:虽然我只是指出了错误发生的原因,但我下面的发帖人关于使用参数化查询来处理这类事情是正确的;或者可能是诸如 LINQ 之类的 ORM

    【讨论】:

      【解决方案3】:

      我觉得你应该看看

      SQL Parameters in C#

      SqlParameter Class

      尽量避免SQL injection

      SQL注入是代码注入 利用安全性的技术 漏洞发生在 应用程序的数据库层。这 当用户存在漏洞时 输入被错误过滤 对于字符串文字转义字符 嵌入在 SQL 语句或用户中 输入不是强类型的并且 从而意外执行。它是 一个更一般的类的实例 可能发生的漏洞 每当一个编程或脚本 语言嵌入在另一种语言中。 SQL注入攻击也被称为 作为 SQL 插入攻击

      总而言之,基于动态创建的查询字符串的攻击,您在应用程序中留下了巨大的空白。您所引用的错误将得到处理,但也会避免任何错误,比如说 DROP TABLE USERS

      【讨论】:

      • 您好,感谢您的关注。我知道 SQL 注入,我目前只是想让一些东西工作,然后我会重新考虑它以更安全。此外,这些变量都没有从查询字符串中分配值,例如当前用户来自 'Page.User.Identity.Name.ToString();'
      • 一旦进入凹槽非常容易滑倒。早点养成习惯,而不是晚点。它将为您节省大量时间。使用正确的方法,这个查询很容易工作。无论如何祝你好运X-)
      【解决方案4】:

      在哪里

      上述语法,尤其是

      同时使用参数来防止 SQL 注入攻击。

      【讨论】:

        【解决方案5】:

        显然,这是 SQL 的语法错误,而不是 C#。

        您需要在运行时获取要插入的值——然后您会在 SQL 语句中看到语法错误。

        编辑 或者你可以按照@zincorp 所说的去做:)

        作为一般做法,在这种情况下使用String.Format 更具可读性。更重要的是,你还想确保你逃避你的文字。

        【讨论】:

          【解决方案6】:

          确实,参数化 SQL 更安全——我也使用它:

          string mySqlStmt = "UPDATE tbSystem SET systemCode_str = @systemCode_str, systemName_str = @systemName_str";
          
                      using (var conn = new SqlConnection(myConnStr))
                      using (var command = new SqlCommand(mySqlStmt, conn)
                      {
          
                          CommandType = CommandType.Text
          
                      })
                      {
                          //add your parameters here - to avoid SQL injection
                          command.Parameters.Add(new SqlParameter("@systemCode_str", "ABZ"));
                          command.Parameters.Add(new SqlParameter("@systemName_str", "Chagbert's Shopping Complex"));
          
                          //now execute SQL
                          conn.Open();
                          command.ExecuteNonQuery();
                          conn.Close();
                      }
          

          您会注意到,使用参数化 SQL,我不必担心值中的引号,就像上面“Chagbert's Shoppin...”中的引号“'”中那样

          【讨论】:

            猜你喜欢
            • 2015-03-20
            • 2023-03-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多