没有mysql_real_escape_string和bindValue的PDO

时间:2013-07-23 15:11:23

标签: php pdo

我对PDO比较陌生,我编写了以下代码块:

$id = $_GET['id'];

$db = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8', 'username', 'password');

foreach($db->query("SELECT id,name FROM names where id = '$id' ") as $row) {
    echo "<p>", ($row['name']), "<br>";
}

我的不确定因素是:

  1. 因为我正在使用PDO,所以第一行中的OMIT mysql_real_escape_string是安全的
  2. 在不使用绑定值的情况下运行上述查询是安全的。
  3. 由于

2 个答案:

答案 0 :(得分:5)

不,这不安全。 PDO不会神奇地逃避您的查询。如图所示,您的代码对SQL注入非常开放。

如果您在查询中使用变量,请不要使用->query。不要试图自己逃避它们。你应该使用准备好的陈述。这是安全的方式。

$stmt = $db->prepare('SELECT id,name FROM names where id = ?');
if($stmt->execute(array($id))){
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        echo "<p>", ($row['name']), "<br>";
    }
}

所以,是的,您需要使用bindParamexecute,如图所示。

P.S。对于(已弃用的)mysql_real_escape_string扩展,mysql_ 。它不适用于PDO。

答案 1 :(得分:2)

回答你的问题,

  1. 只要你使用绑定就可以省略mysql_real_escape_string(嗯......你无论如何都不能将mysql_real_escape_string与PDO一起使用)< / p>

  2. 不。这绝对不安全。无论您是否使用PDO都无关紧要。