【问题标题】:Ignore apostrophe in sql query from text box从文本框中忽略 sql 查询中的撇号
【发布时间】:2018-09-24 19:20:27
【问题描述】:

我在堆栈溢出时非常享受我在这里的逗留,我发现了比我数不清的更多有用信息。

但是,通过我所有的搜索,我还没有找到我的问题的答案。

我有一个将数据输入 SQL 数据库的 Winforms 应用程序。我在将此表单中的文本框发布到数据库时遇到问题。

如果用户输入撇号或引号,则 Visual Studio 中的查询将停止在该撇号在文本框中的位置,即使之后有更多数据并且不会将数据输入数据库。

我知道添加第二个撇号会取消输入的撇号,但是,在执行查询以取消它们之前,我似乎无法读取文本框中的数据。我已经举了一个例子来说明这个文本框中什么是有效的,什么打破了这个问题中的查询,以便进一步澄清。

对不起,各位,我好像忘记把我的代码放到这个帖子里了。

        Dim InsertQuery As String = "INSERT INTO SelfInstallNotes (Troubleshooting, DateAndTime, [CL to OD], [Swapped Dscntd Clocks], [Upgrading to SaaS], [Update Version], [Created RPF], [Created RMA], [Clock Serial], [Case Number], [User], [Grabbed], [Account Manager], [Transferred to AM]) VALUES('" & Hidden.TextBox6.Text.ToString & "'" & "," & "'" & DateTimePicker1.Value & "'" & "," & "'" & CheckBox1.CheckState & "'" & "," & "'" & CheckBox2.CheckState & "'" & "," & "'" & CheckBox3.CheckState & "'" & "," & "'" & CheckBox4.CheckState & "'" & "," & "'" & CheckBox5.CheckState & "'" & "," & "'" & CheckBox6.CheckState & "'" & "," & "'" & TextBox2.Text & "'" & "," & "'" & TextBox1.Text & "'" & "," & "'" & TextBox6.Text & "'" & "," & "'" & Hidden.TextBox3.Text & "'" & "," & "'" & Hidden.TextBox4.Text & "'" & "," & "'" & Hidden.TextBox5.Text & "'" & ")"

但是在阅读了你们所有人的答案之后,这段代码肯定是错误的,并且可能会在以后引起问题。我将尝试下面发布的答案并相应地更新线程。

由于 can't 中的撇号,此查询不会发布到 DB

虽然文本框中的此输入将毫无问题地发布,因为没有撇号或引号。

【问题讨论】:

  • 您需要阅读 SQL 参数和 SQL 注入。从用户输入字段直接插入数据库是一个坏主意。
  • 如何构建查询?永远不要仅仅通过将参数连接为字符串来做到这一点——这会让你面临 SQL 注入攻击。
  • 你的屏幕截图没那么有用。显示您的代码。

标签: sql .net vb.net


【解决方案1】:

问题比你知道的还要严重。这也是一个巨大的安全问题。尝试将以下文本放入您的输入中:

';删除表 [MyCallTable];--

如果您重视数据,也可以不这样做。

幸运的是,对于安全问题和正常的日常撇号,解决方案是相同的;您使用查询参数将所有用户输入与 SQL 命令的其余部分隔离

这是一个例子:

var SQL = "SELECT * FROM Users WHERE LastName = @LastName";
using (var cn = new SqlConnection("connection string here"))
using (var cmd = new SqlCommand(SQL, cn))
{
    //TextBox1 can have text with ' characters, and it won't matter.
    cmd.Parameters.Add("@LastName", SqlDbType.NVarChar, 25).Value = TextBox1.Text;

    cn.Open();
    DataGrid1.DataSource = cmd.ExecuteReader();
}

这也有其他形式,具体取决于您的环境,但重要的是文本输入从不 在任何时候直接替换为 SQL 命令— 甚至不在数据库服务器上。这可以防止将错误输入注入 SQL 的任何可能性。它还可以更轻松地正确获取日期格式等内容,因为现在 ADO.Net 提供程序将为您处理转换。

主要要了解的是,如果您曾经发现自己在做这样的事情:

sql = "SELECT * FROM [Table] WHERE Field='" + TextBox.Text + "'";

甚至这个:

sql = "SELECT * FROM [Table] WHERE Field='" + TextBox.Text.Replace("'", "''") + "'";

你做的事情非常错误

这是非常重要的事情之一,值得回顾旧代码库,以在下一个版本之前修复您以错误方式完成的每个实例,而且我不会经常这么说。

【讨论】:

    【解决方案2】:

    var stringvariable = tempString.Replace("'", "''");// 转义单引号

    【讨论】:

    • 这是错误的做法,而且只是糟糕的建议。
    猜你喜欢
    • 2013-05-07
    • 2011-10-09
    • 2017-08-14
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 2021-07-21
    • 2023-03-14
    相关资源
    最近更新 更多