【问题标题】:How to use named parameters / named prepared statements with Postgres and ADODB如何在 Postgres 和 ADODB 中使用命名参数/命名准备语句
【发布时间】:2013-07-31 15:06:53
【问题描述】:

我正在清理一些通过 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 中,该 ORM 将无序地子化这些值。如果我可以按名称发送它们,那么我可以干净地做到这一点。

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

【问题讨论】:

  • 我仍在寻找一种“正确”的方法来做到这一点。然而,在我自己的情况下,我的解决方法是:就在执行 SQL 之前,解析 SQL 字符串,找到 @replacement 标记,然后替换一个?,并创建一个参数。这样,参数就按顺序创建了。但它很老套。而且我还必须猜测何时应该替换数值。
  • 可能是驱动问题。我的建议是检查您正在使用的驱动程序,查看选项并联系驱动程序开发人员。不幸的是,您可能会从这种方法中获得比这里更多的里程。

标签: asp-classic odbc adodb


【解决方案1】:

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

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

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

阿布拉索

【讨论】:

  • 谢谢阿布拉佐。不幸的是,我目前无法访问该系统(它仍在运行),因此我无法验证这是否可行。但这听起来很有希望。
猜你喜欢
  • 2021-11-18
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多