忽略文本框中的SQL查询中的撇号

时间:2018-09-24 19:20:27

标签: sql .net vb.net

我非常乐于在堆栈溢出的情况下待在这里,我发现了比我所数更多的有用信息。

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

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

如果用户输入撇号或引号,则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 & "'" & ")"

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

由于不能使用单引号,因此该查询不会发布到数据库

Screen shot with apostrophe

由于没有撇号或引号,因此在文本框中的此输入将无任何问题地发布。

Screenshot without apostrophe

2 个答案:

答案 0 :(得分:10)

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

'; DROP TABLE [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("'", "''") + "'";

您正在做某事非常错误

这是很重要的事情之一,有必要回顾旧的代码库,以修复在下一个版本发布之前用错误的方式修复了每个实例的实例,这并不是我经常说的那样。 / p>

答案 1 :(得分:-8)

var stringvariable = tempString.Replace(“'”,“''”); //这转义了单引号