可能重复:
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注入和其他漏洞?
编辑:
查询正在从“index.php”页面进行传递到API。
一行是:
$Num = $Start->PDONumb("SELECT * FROM news");
但是后来,当我用这个覆盖了我的轨道。我想使用它更高级,因此它将传递用户定义的变量(因此SQL注入问题)
但目前,传递的查询是由管理员定义的。
答案 0 :(得分:4)
如果没有看到您传入的SQL,我们无法分辨。如果您使用不受信任的数据创建不安全的SQL语句,那么它们是否在PDO中执行并不重要。你仍然可以接受SQL注入。
例如,如果您从网络获得$userid
并构建:
$sql = "SELECT * FROM users WHERE userid=$userid";
SQL语句是为SQL注入打开的,因为如果$userid
的值是0; DROP TABLE users;
,那么您将创建的SQL将是
SELECT * FROM users WHERE userid=0; DROP TABLE users;
如果您通过PDO执行该操作并不重要:您仍在执行坏人发送给您的代码。
要正确使用PDO,您需要bind your parameters。
与您的问题无关,但是新手经常遇到的一个重点:没有必要在单个变量周围放置双引号。你的代码
$Delete = $this->dbh->exec("$Var");
会更好地写成
$Delete = $this->dbh->exec($Var);