【问题标题】:PostgreSQL prepare/execute statement written correctly using php?使用 php 正确编写的 PostgreSQL 准备/执行语句?
【发布时间】:2012-07-16 16:47:59
【问题描述】:

我听说在 SQL 语句中使用 PREPAREEXECUTE 会将用户提供的数据清理为无法进行 SQL 注入的数据。这是真的吗?

我原来的查询是这样的:

$query = 
"SELECT * FROM sales_orders 
WHERE ksisoldby ILIKE '".$user."'";

这是我将其更改为准备/执行语句的最佳猜测:

 <?php
$id = $_POST['id'];
$search = $_POST['user_supplied_search_term'];

PREPARE search_query_function (varchar, varchar) AS

SELECT * FROM sales_orders 
WHERE ksisoldby ILIKE '$1'";

EXECUTE search_query_function($id, $search);
?>

这是正确写入/调用的吗?还有一些我读过的内置 php 对象 (PDO)。我应该使用它们来代替还是结合使用?感谢您就这类广泛的问题提供帮助。

【问题讨论】:

  • 是的,您应该使用 PDO 代替新代码。
  • 这不是有效的 PHP 语法。
  • @nickb 是的,你是对的。现在我想起来了,我不知道如何将prepare/execute 合并到 php 中。我现在所拥有的没有意义,我明白了。。
  • 我认为你应该简化你的例子来学习如何使用准备好的语句。我们已经讨论了SQL query itself already
  • @ErwinBrandstetter 绝对是个好主意。固定。

标签: php sql postgresql


【解决方案1】:

您可以通过使用准备好的语句将prepare()execute() 合并到PHP 中,这在您使用PDO 时可用。此扩展负责根据您选择的数据库驱动程序为您的数据库创建适当的PREPAREEXECUTE 语句。

这是一个改编自 the PHP manual 的示例,使用 prepare()execute()

$sth = $dbh->prepare('SELECT * FROM sales_orders 
    WHERE ksisoldby ILIKE ?');
$sth->execute( array( $_POST['user_supplied_search_term']));

这将为您处理参数转义并创建类似于以下内容的 SQL 语句:

SELECT * FROM sales_orders 
    WHERE ksisoldby ILIKE 'something'

因此,您需要修改上述代码以在对prepare() 的调用中包含您的 SQL 语句,这需要您在希望包含参数的位置添加占位符。然后调用execute(),它将添加传递给它的值。

【讨论】:

  • 感谢您的解决方案。几个问题:我是否会为PREPARE 语句提供始终使用值数组的值。我是否需要设置$dbh 或者是否准备好接受PREPARE 方法而无需额外准备?除了防止 SQL 注入之外,这样做有什么好处吗?再次感谢!
  • 您需要通过调用 PDO 的构造函数来初始化$dbh,有关详细信息,请参阅手册。您永远不会自己形成PREPARE 声明 - 您让 PDO 为您处理。因此,您只需提供要执行的 SQL 语句,然后让 PDO 完成其余的工作。
【解决方案2】:

您也可以使用pg_query_params,使用方便且安全。

【讨论】:

    猜你喜欢
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 2020-04-14
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多