函数mysql_real_escape_string的 PDO 等效项是什么?

2022-08-30 10:52:52

我正在修改我的代码,从使用到.在我的代码中,我有.在PDO中,这相当于什么?mysql_*PDOmysql_real_escape_string()


答案 1

好吧,没有!没有!

从技术上讲,有PDO::quote(),但它很少使用,也不等同于mysql_real_escape_string()

没错!如果您已经以使用预准备语句记录的正确方式使用PDO,那么它将保护您免受MySQL注入的影响。


# Example:

下面是使用预准备语句 (pdo) 的安全数据库查询的示例

  try {
     // first connect to database with the PDO object. 
     $db = new \PDO("mysql:host=localhost;dbname=xxx;charset=utf8", "xxx", "xxx", [
       PDO::ATTR_EMULATE_PREPARES => false, 
       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
     ]); 
 } catch(\PDOException $e){
     // if connection fails, show PDO error. 
   echo "Error connecting to mysql: " . $e->getMessage();
 }

而且,现在假设已建立连接,您可以像这样执行查询。

if($_POST && isset($_POST['color'])){ 

    // preparing a statement
    $stmt = $db->prepare("SELECT id, name, color FROM Cars WHERE color = ?");

    // execute/run the statement. 
    $stmt->execute(array($_POST['color']));

    // fetch the result. 
    $cars = $stmt->fetchAll(\PDO::FETCH_ASSOC); 
    var_dump($cars); 
 }

现在,正如您可能知道的那样,我没有使用任何东西来逃避/净化的价值。由于PDO和预准备语句的强大功能,此代码可以安全地进行myql注入。$_POST["color"]


值得注意的是,出于安全原因,您应该在上面看到一个 as 属性,并始终使 PDO 以异常的形式显示错误。charset=utf8DSN

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

因此,来自数据库查询的错误不会泄露敏感数据,例如目录结构,数据库用户名等。

最后但并非最不重要的一点是,有些时候你不应该信任PDO 100%,并且必然会采取一些额外的措施来防止sql注入,其中一种情况是,如果你使用的是过时的mysql版本,如这个答案中所述。[ mysql =< 5.3.6 ]

但是,使用如上所示的预准备语句将始终比使用任何以 开头的函数更安全mysql_

好读物

面向 MySQL 开发人员的 PDO 教程


答案 2

没有*!PDO的目标是您不必逃避任何东西;您只需将其作为数据发送即可。例如:

$query = $link->prepare('SELECT * FROM users WHERE username = :name LIMIT 1;');
$query->execute([':name' => $username]); # No need to escape it!

相反:

$safe_username = mysql_real_escape_string($username);
mysql_query("SELECT * FROM users WHERE username = '$safe_username' LIMIT 1;");

*嗯,有一个,正如Michael Berkowski所说!但是有更好的方法。


推荐