【发布时间】:2012-11-20 04:30:30
【问题描述】:
可能重复:
Are PDO prepared statements sufficient to prevent SQL injection?
我对推出新 API 的主要关注点是安全性,我已经研究了几天。
我是 PDO 用法的初学者,但知道主要结构。但我不知道如何保护查询免受 SQLInjection 的影响。
我的代码如下:
<?php
$Start = new Db();
class Db
{
private $dbh = null;
public function __construct()
{
$this->dbh = new PDO('mysql:host=localhost;dbname=pdo', 'root', 'xxxxx');
}
public function PDOFetch($Var)
{
$sth = $this->dbh->prepare("$Var");
$sth->execute();
$result = $sth->fetchAll();
return $result;
}
public function PDONumb ($Var)
{
$sth = $this->dbh->prepare("$Var");
$sth->execute();
$count = $sth->rowCount();
return $count;
}
public function PDODel ($Var)
{
$Delete = $this->dbh->exec("$Var");
return $Delete;
}
public function PDOQuery ($Var)
{
$Query = $this->dbh->query("$Var");
return $Query;
}
}
?>
我将如何防止 SQL 注入和其他漏洞?
编辑:
例如,传递到 API 的查询是从“index.php”页面完成的。
一行是:
$Num = $Start->PDONumb("SELECT * FROM news");
但后来,当我用这个掩盖了我的踪迹时。我想更高级地使用它,所以它会传递用户定义的变量(因此是 SQL 注入问题)
但目前,通过的查询是由管理员定义的。
【问题讨论】:
-
防止sql注入确实是人们使用PDO的要点之一。它确实提供保护。为什么你认为你必须自己做?如果您不犯错误,在某处存储额外的 sql 语句标记以在执行时将它们组合起来,PDO 就足够了。
-
@arkascha 我是使用 api 的新手,我已经习惯了 mysql API,它需要手动输入以使用预定义的函数进行保护。那么你的说法是,PDO 保护它自己免受注射?
-
PDO 不会保护自己,如果您使用“准备好的语句”,它会保护您的查询。您首先准备一个包含占位符的语句。在执行期间将值绑定到这些占位符。这就是所谓的“绑定”。检查下面的 Andy Lesters 答案。
-
请查看bobby-tables.com/php.html,了解如何使用占位符的示例。此外,您不必使用 PDO 来使用占位符变量。
-
PDO 需要将两件事相互分开:要准备的语句和运行时执行的参数。不要混合这些。如果你通过创建一个包含准备执行的 sql 语句的字符串来混合它,那么 PDO 就无法保护你。您可以包装 PDO,您总是必须采取两个步骤:首先准备一个语句,让 PDO 将参数绑定到它。不要使用字符串函数自己绑定它们。
标签: php pdo sql-injection