0

我第一次尝试使用 PDO,我只是想知道我正在做的事情有多安全,我也是 PHP 新手。

我有一个查询,当用户通过我的页面时,页面使用 GET 获取一个变量,然后运行。

使用 PHP,我一直使用 mysql_real_escape 来清理我的变量。

任何人都可以看到这个安全漏洞吗?

// Get USER ID of person
$userID = $_GET['userID'];

// Get persons
$sql = "SELECT * FROM persons WHERE id =$userID";
$q = $conn->query($sql) or die($conn->error());
while($r = $q->fetch(PDO::FETCH_LAZY)){
    echo '<div class="mis-per">';
    echo '<span class="date-submitted">' . $r['date_submitted'] . '</span>';
   // MORE STUF
    echo '</div>';
}
4

4 回答 4

4

不要使用查询,使用准备:

http://php.net/manual/de/pdo.prepare.php

$userID = $_GET['userID'];

$sql = "SELECT * FROM persons WHERE id = :userid";

$q = $conn->prepare($sql)
$q->execute(array(':userid' => $userID ));

while($r = $q->fetch(PDO::FETCH_ASSOC)){ 
    echo '<div class="mis-per">'; 
    echo '<span class="date-submitted">' . $r['date_submitted'] . '</span>'; 
   // MORE STUF 
    echo '</div>'; 
} 

SQL 语句可以包含零个或多个命名 (:name) 或问号 (?) 参数标记,在执行语句时将替换它们的实际值。

于 2012-07-12T10:47:58.810 回答
2

对于你使用的任何东西,重要的是你如何使用它,而不是你使用什么。我认为 PDO 本身是非常安全的,只要你正确使用它。

$sql = "SELECT * FROM persons WHERE id =$userID";

那很糟 *。更好的 :

$sql = "SELECT * FROM persons WHERE id = " . $conn->quote($userID);

更好的 :

$q = $conn->prepare('SELECT * FROM persons WHERE id = ?')->execute(array($userID));

* 这很糟糕,这是因为如果$userID"1 OR 1",则查询SELECT * FROM persons WHERE id =1 OR 1将始终返回persons表中的所有值。

于 2012-07-12T10:47:01.323 回答
1

正如评论所说:ATM 对 SQLI 没有任何安全性。PDO 为您提供(如果数据库驱动程序支持它(mysql 支持))Prepared Statements。把它想象成一个查询模板,它被编译/传递给 dbms,然后用值填充。这是一个使用示例:

$sql = 'SELECT name, colour, calories
  FROM fruit
  WHERE calories < :calories AND colour = :colour';

 //Prepare the Query

$sth = $dbh->prepare($sql);

     //Execute the query with values (so no tainted things can happen)
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
于 2012-07-12T10:49:28.473 回答
1

调整如下(您可以使用:userId或简单地使用?Tom van der Woerdt 建议的方法,即使我认为第一个更清晰,尤其是当参数不止一个时):

$sql = "SELECT * FROM persons WHERE id =:userID";
$q = $conn->prepare( $sql );
    $q->bindValue( ":userID", $userID, PDO::PARAM_INT ); // or PDO::PARAM_STR, it depends
    $q->execute();
    $r = $st->fetch();
...
...
于 2012-07-12T10:51:27.427 回答