【问题标题】:vb.net special character in sql query variable [duplicate]sql查询变量中的vb.net特殊字符[重复]
【发布时间】:2018-01-24 21:19:03
【问题描述】:

我正在尝试使用 vb.net 中的 sql 字符串从数据库中检索数据集。

代码:

Dim sSql As String = "Select * FROM mytable where id = " + propID
Dim ds As DataSet = New DataSet()

Try
ds = coApp.ConnectionManager.LoadSQLToDs(sSql)
Catch ex As Exception

propID 变量是一个包含“/”的值,例如“1/83/42”。 异常消息是:'/' 附近的语法不正确。 如何在我的 sql 字符串中传递这个值?

【问题讨论】:

  • 用单引号括起来。 IE。 "Select * FROM mytable where id = '" + propID + "'"
  • OP:使用参数,这将修复错误。不要执行字符串连接建议,这是一种不好的做法。请忽略这些建议并编写好的代码。
  • 使用 SQL 参数意味着永远不必担心特殊字符、数据类型转换、sql 注入和许多其他事情
  • 不幸的是,LoadSQLToDs() 可能从根本上被破坏,将迫使 OP 编写极其不安全的代码。
  • 谦虚的教训将是当有人通过“1; DROP mytable”

标签: sql sql-server vb.net


【解决方案1】:

propID 的值中是否已经包含引号?如果不是简单地引用它应该可以解决问题:

Dim sSql As String = "Select * FROM mytable where id = '" + propID + "'"

如果您要在代码中打印变量 sSql,您会得到 SQL:

Select * FROM mytable where id = 1/83/42

这是无效的 SQL。

【讨论】:

  • 不!这不是一个好主意。我们不知道propID 的值是从哪里来的,而你那里的那个语句对于SQL 注入是敞开的。 参数化您的 SQL 或使用存储过程。
  • 那又怎样?OP只是想找出错误的原因而不是SQL最佳实践,显然是初学者的错误而不是生产系统,这个答案很好。
  • @larnu 我同意这是一个坏主意,但这是所提问题的解决方案。我们不知道propID 来自哪里,但提问者知道。如果它不是来自用户,那么这段代码没有任何问题,肯定有更好的方法可以做到这一点,但这不会让 SQL 注入打开。
  • 那又怎样?所以一切。提供对 SQL 注入开放的答案不是答案。就像使用 Duck Tape 密封汽车油箱上的一个洞一样。这是一个糟糕的想法,可能会发生灾难。
  • "如何在我的 sql 字符串中传递这个值?"是问题,而不是“为什么会发生这种情况”。参数化是最好的答案。故事结束。