1

我正在清理一些通过 ADODB 与 Postgres 数据库 (8.2) 对话的遗留 asp-vba 代码。目前它正在为 SQL 语句使用字符串构建,显然我想使用准备好的语句来避免 SQL 注入。

我无法弄清楚如何使用命名变量来做到这一点。我只用“?”成功地做到了。运算符并按照它们在 SQL 中定义的顺序添加参数。这对我的情况[1]不好。

我已经能够使用 ? 运算符和 CreateParameter(...):

var oCmd = Server.CreateObject("ADODB.Command");
oCmd.CommandText = "SELECT * FROM sometable WHERE somefield = ? AND another = ?";
oCmd.Parameters.Append oCmd.CreateParameter("", adVarChar, adParamInput, 50, "val1")
oCmd.Parameters.Append oCmd.CreateParameter("", adVarChar, adParamInput, 50, "val2")

但是,如果我尝试使用名称来执行此操作,则它不起作用

var oCmd = Server.CreateObject("ADODB.Command");
oCmd.CommandText = "SELECT * FROM sometable WHERE somefield = @a AND another = @b";
oCmd.Parameters.Append oCmd.CreateParameter("@b", adVarChar, adParamInput, 50, "val2")
oCmd.Parameters.Append oCmd.CreateParameter("@a", adVarChar, adParamInput, 50, "val1")

我看到一些注释说它实际上可能是 ODBC 的失败(http://www.codeproject.com/Tips/231217/Parameters-SqlCommand-vs-OledbCommand-and-OdbcComm)。有谁知道解决此问题或其他选项的方法?

[1] 不幸的是我不能使用?? ? 并按顺序定义参数。代码已经包含在一个遗留的 ORM 中,它将乱序子化这些值。如果我可以按名称发送它们,那么我可以干净地做到这一点。

任何帮助或指示将不胜感激。

4

1 回答 1

2

我曾经不得不修改 adodb(2004 版)的 postgres 驱动程序,使其能够处理参数和在 postgres 语句中使用正则表达式。问题是使用“?” 问题字符始终被解释为参数。所以我在_query方法上修改了 Postgres 7 驱动程序,将第 151 行更改为:

$sqlarr = explode(' ?',trim($sql)); 

只需在问号前添加一个空格。这 ' ?' 被驱动程序替换为 $1、$2 等,因此,您可能预期此替换会发送此命名参数 $1、$2 而不是“?”。

阿布拉佐

于 2015-10-14T18:13:46.890 回答