【问题标题】:Can't get a variabel to work in CommandText statement getting errorIncorrect syntax near '@P1'无法在 CommandText 语句中使用变量在“@P1”附近出现错误语法错误
【发布时间】:2018-01-23 15:54:58
【问题描述】:

我必须参数化一个旧的经典 ASP 程序以消除 SQL 注入。该程序允许用户选择几个选项来搜索数据库。它将用户选择构建成一个字符串,类似于下面的选择行。加粗部分是程序构建的 qry_str,然后通过参数插入到命令文本中。问题是当我检查命令文本时,它看起来像第二个选择语句,并且在“@P1”附近出现错误语法错误。任何帮助将不胜感激。

select * from vw_results_2 where 0=0 **and tn_id=0.003001** 

select * from vw_results_2 where 0=0 **?**  

if serial_number <> "" then
  qry_str = qry_str&" AND TN_ID = "&serial_number
end if
if base <> "" then
  qry_str = qry_str&" AND BASE_ID = "&base
end if
if engineer <> "" then 
  qry_str = qry_str&" AND POC_USERID = '"&engineer&"'"
end if
if damage_area <> "" then 
  qry_str = qry_str&" AND DAMAGE_NOUN_ID = &damage_area
end if
if part_number <> "" then
  qry_str = qry_str&" AND PART_NUMBER LIKE '%"&part_number&"%'"
end if

set cmd = Server.CreateObject("ADODB.Command")
    cmd.ActiveConnection = tadsdb
    cmd.CommandText = sortorder("SELECT * FROM VW_RESULTS_2 WHERE 0=0 ? ORDER BY ")
    cmd.Parameters.Append cmd.CreateParameter("@parm1",adVarChar,adParamInput,50,qry_str)

【问题讨论】:

  • 你为cmd创建了一个参数,但是CommandText似乎没有参数。还是我错过了什么
  • 您有定义 adVarChar 和 adParamInput 的包含文件吗?
  • 是的,我将 adovbs.inc 文件作为包含语句。在经典的asp中?是变量假设参数的位置。并且由于某种原因它没有说出来。由于某种原因,我的帖子的一部分被删除了。当我创建 select 语句并检查命令文本时,它看起来像这样“从 0=0 的表中选择 *?”相反,它应该看起来像这样“从 0=0 和 id = 12345 的表中选择 *”不知道为什么?没有被替换为“and id - 12345”
  • 您不能使用参数化查询来添加这样的自定义内容。当您定义参数和类型时,adodb 将此信息传递给 RMDBS 提供程序,然后根据传递的类型生成经过清理的 SQL。在这里您指定参数,以便您的 SQL 将生成为字符串,并且您最终会得到类似 SELECT * FROM VW_RESULTS_2 WHERE 0=0 ' AND TN_ID = 12345' ORDER BY (注意添加到 SQL 字符串中的字符串字符 '
  • 要执行您正在尝试的操作,您需要正常构建字符串,但在构建的每个条件字符串中使用参数化占位符 (?),同时还要构建参数,以便它们按照与所需数据类型匹配的顺序构建。

标签: sql parameters asp-classic


【解决方案1】:

参数化的重点是将代码数据分开。如果您可以将代码放在参数中并将其视为代码,那么您将移动可能进行 SQL 注入的地方。

处理这个问题的一种方法(不理想但不是不合理的,直到性能受到明显影响,由于位置参数)是这样编写查询:

select * from vw_results_2 where
   TN_ID = COALESCE(?,TN_ID) and
   BASE_ID = COALESCE(?,BASE_ID) AND ...

然后让您的条件逻辑决定是为每个参数提供一个 还是将其设置为 NULL(以便 COALESCE 跳过它并改用列值) .

【讨论】:

    【解决方案2】:

    嗯,我不确定这是否是完整的答案,但你错过了一个报价......

    if damage_area <> "" then 
      qry_str = qry_str&" AND DAMAGE_NOUN_ID = &damage_area
    end if
    

    应该是

    if damage_area <> "" then 
      qry_str = qry_str&" AND DAMAGE_NOUN_ID = " &damage_area
    end if
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      相关资源
      最近更新 更多