【问题标题】:string with 's not getting inserted with insert statement带有 ' 的字符串没有被插入语句插入
【发布时间】:2013-07-24 06:18:37
【问题描述】:

我正在尝试在数据库中插入一个问题,表中的字段为 nvarchar(max) (sql server 2008 r2)

代码如下:

Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click
    gc.ExecuteCommand("insert into QuestionMaster values('" & txtQuestion.Text & "','" & ViewState("ClientID") & "','" & ViewState("KioskID") & "')")
    Response.Write("<script type='text/javascript' language='javascript'>alert('Question Added Sucessfully!!!')</script>")
    BindGrid()
End Sub

当我插入任何字符串时:

what's your name? 

然后它给我错误:

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

如果我只是提供字符串为:

What is your name?

那么它不会给我错误。

请帮帮我。

【问题讨论】:

  • 简单修复更改为参数化查询
  • 恭喜。您刚刚发现了 SQL 注入的起点 - 以及为什么应该使用参数将数据(列值)与代码(SQL is 代码分开,尽管它作为字符串嵌入到您的 VB 中)。所以去搜索参数化查询
  • 这不是关于c#,标签已删除。
  • @SonerGönül 在 c# 中的回答也对我有帮助,因为我认为问题与 sql 而不是 C# 或 vb 更相关,所以我也标记了 c#
  • M.N.S. 下定决心......听起来你不知道你在说什么......我可以看到你正在挖掘的洞越来越深

标签: asp.net .net sql vb.net


【解决方案1】:

如果可能,您应该使用参数化查询,因为如您所见,将简单的字符串直接插入查询可能会破坏查询。

换句话说,如果文本框包含Paddy O'Rourke,您的查询变为:

                                 open   close   what the ?
                                  |       |      |
insert into QuestionMaster values('Paddy O'Rourke') ...

您可以看到嵌入的' 正在破坏查询。

正如您尚未意识到的那样,它还会允许人们对您的数据库执行 SQL 注入攻击,因为您没有清理输入。

如果出于某种原因,您的商店不允许参数化查询(从您的一个 cmets 中显示),请另找工作地点。不,开个玩笑,但在这种愚蠢的政策面前,您需要自己清理输入。

但这充满了危险,我会首先尝试改变这样的政策,毫不含糊地列出所涉及的风险。

【讨论】:

    【解决方案2】:

    好吧,你应该使用Parameterized queries

    这也将避免SQL Injection

    【讨论】:

    • 是的,我知道,但在我们公司,我必须使用 insert update delete 的修复结构,其中不包括参数化查询。
    • 哈哈,真是个假借口。如果您可以编写动态查询,您绝对可以用参数替换该 sql 语句,特别是如果您实际编写了代码..
    • @DJKRAZE 是的,参数化后它可以工作,刚刚测试过,但我必须在公司提供给我的代码结构内工作。所以不能使用参数化查询。
    • @M.N.S.这是没有意义的。参数化查询具有固定的结构。使用字符串连接将值构建到 SQL 查询中只是一种不好的做法。
    • 你没有意义..代码结构是什么意思..我感觉你不熟悉Thinking outside the box这个术语如果他们提供的代码导致潜在问题为什么继续循环..?或许您应该主动就我们在这里指出的问题发表意见
    【解决方案3】:

    您的数据可能包含一些特殊字符,例如单引号,这会使您的语句失败。

    所以最好使用parameterized query参数化查询在运行 SQL 查询之前会正确替换参数。

    SqlCommand insertNewAreaPath = new SqlCommand(
        "insert into QuestionMaster (Question, ClientID, KioskID) VALUES(@Question, @ClientID, @KioskID)", con);
    insertNewAreaPath.Parameters.Add("@Question", txtQuestion.Text);
    insertNewAreaPath.Parameters.Add("@ClientID", ViewState("ClientID"));
    insertNewAreaPath.Parameters.Add("@KioskID", ViewState("KioskID"));
    insertNewAreaPath.ExecuteNonQuery();
    

    否则:使用.Replace("'", "''")

    gc.ExecuteCommand("insert into QuestionMaster values('" & txtQuestion.Text.Replace("'", "''") & "','" & ViewState("ClientID") & "','" & ViewState("KioskID") & "')")
    

    【讨论】:

      【解决方案4】:

      您可以通过将 txtQuestion.Text 中的单引号 (') 替换为两个单引号 ('') 来转义单引号。

      Protected Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click
          gc.ExecuteCommand("insert into QuestionMaster values('" & txtQuestion.Text.Replace("'", "''") & "','" & ViewState("ClientID") & "','" & ViewState("KioskID") & "')")
          Response.Write("<script type='text/javascript' language='javascript'>alert('Question Added Sucessfully!!!')</script>")
          BindGrid()
      End Sub
      

      【讨论】:

      • @M.N.S.:请记住,这可以解决您的立即问题。我怀疑你很快就会回来:-)
      • @paxdiablo 是的,我知道,但不能做任何事情,必须遵守公司规则
      • @M.N.S. - 您的公司规则要求您的代码易受 sql 注入攻击?
      • @ChrisDunaway 是的。好像是。
      【解决方案5】:

      把'换成''就可以了。

      试试这个 你叫什么名字?

      【讨论】:

      • @M.N.S.,我认为 Abhishek 的意思是尝试使用文本字符串 what''s your name? 他并没有问你的真名是什么 :-)
      • 你是对的,@paxdiablo。抱歉,M.N.S 的答案令人困惑
      【解决方案6】:
      //declare this variable
      
      String sql="insert into QuestionMaster values('" & txtQuestion.Text & "','" & ViewState("ClientID") & "','" & ViewState("KioskID") & "')";
      

      调试它,你会发现它出现问题的地方。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 2016-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        相关资源
        最近更新 更多