2012-07-17 73 views
0

我使用传统的ASP与参数化的SQL查询字符串如下:传统ASP SQL参数化 - 如何从参数中删除单引号?

SQL = "SELECT * FROM content WHERE Category LIKE ? ORDER BY SubDate ?" 

SQL查询字符串在下面的参数代码中使用了:

Set cmd = Server.CreateObject("ADODB.Command") 
Set rsView = Server.CreateObject("ADODB.Recordset") 
cmd.ActiveConnection = MM_connContent_STRING 
cmd.Prepared = true 
cmd.CommandType = adCmdText 
cmd.CommandText = SQL 
cmd.CommandTimeout = 60 

cmd.Parameters.Append(cmd.CreateParameter("Category", 202, adParamInput, 30, qFilter)) 
cmd.Parameters.Append(cmd.CreateParameter("SubDate", 202, adParamInput, 10, myDateSort)) 

rsView.CursorLocation = adUseClient 
rsView.Open cmd, , adOpenForwardOnly, adLockReadOnly 

的代码,除了一个以上的伟大工程大问题。 “ORDER BY SubDate?”部分输出“ORDER BY SubDate'DESC'”其中DESC由于它是一个参数而添加了单引号。在运行上面的代码时,由于DESC(也可以是ASC,取决于用户通过URL查询字符串选择和发送的内容)的单引号,我得到了一个错误的语法错误。看起来所有的SQL参数都是用单引号输出的。如何从特定的SQL参数中删除单引号,以便它们不会在SQL字符串中创建语法错误?

回答

4

将关键字(或关于该事项的标识符)作为参数是非常罕见的。我没有一个支持它的框架。

由于只有2允许值,你为什么不干脆写:

SQL = "SELECT * FROM content WHERE Category LIKE ? ORDER BY SubDate " 
If myDateSort = "ASC" Or myDateSort = "DESC" Then 
    SQL = SQL & myDateSort 
Else 
    'whoops, value not allowed. raise error... 
End If 
'...rest of your code... 
+0

+1尼斯务实又安全的解决方案,得到我的投票。 – AnthonyWJones 2012-07-17 10:04:02

+0

感谢您的快速回复。我试图通过去参数化查询来避免SQL注入。由于myDateSort是通过URL字符串传递的用户定义变量,我相信如果我直接在代码中显示的参数外使用myDateSort变量,用户仍然可以修改我的SQL查询。它是否正确?再次感谢! – user1531027 2012-07-17 15:38:08

+0

实际上,现在我看到我们正在使用If函数控制分配给myDateSort的值。我想这会保持价值的安全。 – user1531027 2012-07-17 15:40:17