3

我听说在 SQL 语句中使用PREPAREandEXECUTE会将用户提供的数据清理为无法进行 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);
?>

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

4

2 回答 2

5

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

这是一个改编自PHP 手册的示例,使用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'

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

于 2012-07-16T16:58:43.543 回答
1

您也可以使用pg_query_params,易于使用且安全。

于 2012-07-17T04:59:48.283 回答