【问题标题】:Incorrect syntax near '/' when inserting data插入数据时“/”附近的语法不正确
【发布时间】:2014-05-05 23:56:14
【问题描述】:

我正在尝试执行插入查询,但一直收到错误消息:

'/'附近的语法不正确

这是我要插入的内容" /Portals/0/products/HT3-XXX.pdf "

为什么我不能插入'/'

我需要转换成字符串吗?还是什么?

//Inserts 3DModel
SqlConnection sqlCon2 = new SqlConnection("...");
SqlCommand sqlCmd2 = new SqlCommand();
sqlCmd2.CommandText = "INSERT INTO [Products].[Files] ([TypeID] ,[ProductID] ,[URL]) VALUES ('3', " + textBox15.Text + ", " + textBox4.Text + ") ";
sqlCmd2.Connection = sqlCon2;

sqlCon2.Open();
sqlCmd2.ExecuteNonQuery().ToString();
sqlCon2.Close();
MessageBox.Show("3DModel for " + textBox3.Text + "' Has been Added");

【问题讨论】:

  • 您需要转义您的输入并将其放在引号中。不用等待 - 您需要使用 Prepared Statements
  • textBox15.TexttextBox.Text 的值是多少? ProductIDURL 列的类型是什么?并使用参数化查询。这种字符串连接对 SQL 注入 攻击开放。
  • 你需要从你的问题中删除敏感数据。
  • @juergen 给出了更改历史,他真的需要更改他的密码:-)

标签: c# sql sql-server


【解决方案1】:

很可能,它在抱怨您用作参数的 URL。

sqlCmd2.CommandText = "INSERT INTO [Products].[Files] ([TypeID] ,[ProductID] ,[URL]) VALUES ('3', " + textBox15.Text + ", " + textBox4.Text + ") ";
sqlCmd2.Connection = sqlCon2;

参数化您的查询,看看它是否能解决问题:

sqlCmd2.CommandText = "INSERT INTO [Products].[Files] ([TypeID] ,[ProductID] ,[URL]) VALUES (@TypeId, @ProductId, @Url) ";
sqlCmd2.Parameters.AddWithValue("@TypeId", 3);
sqlCmd2.Parameters.AddWithValue("@ProductId", textBox15.Text);
sqlCmd2.Parameters.AddWithValue("@Url", textBox4.Text);
sqlCmd2.Connection = sqlCon2;

【讨论】:

  • @Dunleyyy333 - 这是正确的答案,我想补充一点,你真的,真的,需要阅读the OWASP article on SQL Injection。您的原始代码是如何编写易受攻击的 sql 语句的经典示例。 SQL 注入漏洞可以说是最令人沮丧的攻击,因为它们很常见、成本高昂、用于最具经济破坏性的攻击、身份盗用的主要来源,而且很容易预防。
  • 这非常有效,谢谢!我也会 OWASP 非常感谢你。
【解决方案2】:

问题是因为您在串联查询中的值周围缺少单引号。但是您的查询很容易出现SQL Injection。使用SqlParameter

sqlCmd2.CommandText = "INSERT INTO [Products].[Files] ([TypeID] ,[ProductID] ,[URL]) VALUES ('3', @ProductID, @URL)";
sqlCmd2.Parameters.AddWithValue("@ProductID", textBox15.Text);
sqlCmd2.Parameters.AddWithValue("@URL", textBox4.Text);

考虑使用using 语句与您的连接和命令对象来释放资源。

【讨论】:

【解决方案3】:

您必须将值括在引号中,以便 SQL 了解它是一个字符串:

 sqlCmd2.CommandText = "INSERT INTO [Products].[Files] ([TypeID] ,[ProductID] ,[URL]) VALUES ('3', " + textBox15.Text + ", '" + textBox4.Text + "') ";

但是,此代码容易受到SQL injection 攻击。我强烈建议使用准备好的语句:

 sqlCmd2.CommandText = "INSERT INTO [Products].[Files] ([TypeID] ,[ProductID] ,[URL]) VALUES ('3', @productID, @url) ";
 sqlCmd2.Parameters.AddWithValue("@productID", textBox15.Text);
 sqlCmd2.Parameters.AddWithValue("@url", textBox4.Text);

【讨论】:

  • 你将如何编写准备好的语句?
  • @Dunleyyy333 我在回答中包含了一个示例。
【解决方案4】:

您当前正在使用文本字段的原始内容。这是一个非常糟糕的主意,因为首先您不能制作任何可能终止 SQL 语句的字符。其次,因此,任何人都可以编写删除整个数据库的查询。

现在,为了回答您的问题,您在文本框周围缺少引号。 目前它可以说:

('3', Textbox5ContentHere, Textbox4ContentHere)

当你想要的时候

('3', 'Textbox5ContentHere', 'Textbox4ContentHere')

@Edit:反对者,请解释一下。

【讨论】:

  • 首先你没有解决 sql 注入问题......这就是为什么这被否决了。但别担心,其他答案确实解决了这个问题....除此之外,我怀疑 OP 能否理解您的答案...
  • 如果我错了,请纠正我,但是“删除整个数据库”不是 SQL 注入的一个非常明显的同义词吗?此外,他并没有要求进行安全审查,所以严格来说,我的帖子确实回答了他的问题。
  • 不,不是。用户输入能够改变超出预期功能的数据的每一种情况都是 sqlinjection。而且我并不是说你的答案没有回答这个问题,我说它没有用,因此它被否决了......
  • 怎么回答,回答一个问题没用?如果我错了,请纠正我,但是当你回答一个答案时,它会成功。基础编程,真真假假。然而真假确实是假的。但他要求一个答案,我给了他一个答案,又名。 'if' 语句确实运行。如果那没有用,我不知道是什么。
  • 你不喜欢我的解释,我情不自禁。只是为了记录,让我指给你why vote,然后继续,好吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
相关资源
最近更新 更多