Php pg_prepare()prepared语句(不是PDO)是否阻止SQL注入?

Php pg_prepare()prepared语句(不是PDO)是否阻止SQL注入?,php,security,postgresql,prepared-statement,Php,Security,Postgresql,Prepared Statement,PDO在我正在使用的目标系统中不受支持,尽管我在PostGres DB 8.2+上使用PHP5.1.x寻找防止SQL注入的解决方案。目前没有切换到PDO的机会 我目前的解决方案是pg_准备声明: // Trying to prevent SQL-Injection $query = 'SELECT * FROM user WHERE login=$1 and password=md5($2)'; $result = pg_prepare($dbconn, "", $query); $result

PDO在我正在使用的目标系统中不受支持,尽管我在PostGres DB 8.2+上使用PHP5.1.x寻找防止SQL注入的解决方案。目前没有切换到PDO的机会

我目前的解决方案是pg_准备声明:

// Trying to prevent SQL-Injection
$query = 'SELECT * FROM user WHERE login=$1 and password=md5($2)';
$result = pg_prepare($dbconn, "", $query);
$result = pg_execute($dbconn, "", array($_POST["user"], $_POST["password"]));
if (pg_num_rows($result) < 1) {
  die ("failure");
}

准备好的语句内置在MySQL()中。注入预防机制也在MySQL中,请参见前面链接页面中的以下引用:

防止SQL注入攻击。参数值可以包含未转换的SQL引号和分隔符字符

PHP库只是将它们的功能映射到MySQL函数(可能使用)。所以是的,pg_prepare也应该保护你的注射安全

[编辑]
我刚刚注意到你在谈论PostgreSQL,对于PostgreSQL来说,同样的道理,它是一个内置的,而不是PHP库提供的东西。

据我从文档中收集到的信息,它应该可以防止SQL注入


一种更通用的方法是使用,因为它与准备查询无关。

使用准备好的语句通常是最好的方法,因为您还应该从可以跳过的数据库优化中获得更好的SQL性能


但是,知道其他处理方法总是好的,因此请记住,您可以在受污染的变量上使用,然后直接在SQL查询中使用输出。

准备好的语句不会被SQL注入,因为在它准备好之后,没有人可以更改queryplan。但是,如果您的语句已经被破坏,您仍然会受到SQL注入的影响:

<?php 
// how NOT to construct your SQL....
$query = 'SELECT * FROM user WHERE login=$1 and password=md5($2) LIMIT '. $_POST['limit']; -- injection!
$result = pg_prepare($dbconn, "", $query);
$result = pg_execute($dbconn, "", array($_POST["user"], $_POST["password"]));
if (pg_num_rows($result) < 1) {
  die ("failure");
}
?>


我想是的,但您可以尝试查看
:)
。插入您自己的
DROP TABLE
语句来代替其中一个参数值,并查看是否可以让它删除一个伪表。MySQL在准备语句时遇到了一些棘手的问题:如果具有给定名称的准备语句已经存在,那么它将在准备新语句之前被隐式释放。这意味着,如果新语句包含错误且无法准备,则返回错误且不存在具有给定名称的语句。
<?php 
// how NOT to construct your SQL....
$query = 'SELECT * FROM user WHERE login=$1 and password=md5($2) LIMIT '. $_POST['limit']; -- injection!
$result = pg_prepare($dbconn, "", $query);
$result = pg_execute($dbconn, "", array($_POST["user"], $_POST["password"]));
if (pg_num_rows($result) < 1) {
  die ("failure");
}
?>