什么是函数mysql_real_escape_string的PDO等价物?

REJ*_*OLA 39 php mysql pdo sql-injection

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

sam*_*ayo 66

嗯不,没有!

从技术上来说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();
 }
Run Code Online (Sandbox Code Playgroud)

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

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); 
 }
Run Code Online (Sandbox Code Playgroud)

现在,正如你可能知道的那样,我没有用任何东西来逃避/消毒它的价值$_POST["color"].由于PDO和预处理语句的强大功能,此代码对于myql注入是安全的.


值得注意的是,出于安全原因,您应该charset=utf8在您的DSN上面传递as属性,并始终使PDO能够以异常的形式显示错误.

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
Run Code Online (Sandbox Code Playgroud)

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

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

但是,使用上面显示的预处理语句总是比使用任何开头的函数更安全 mysql_

好读

MySQL开发人员的PDO教程

  • @PeeHaa埽没有.虽然PDO :: quote()执行完整的格式化,转义**和**引用,因此可以安全使用,mysql_real_escape_string执行*不完整*格式化,不应该用作保护措施. (7认同)
  • @andy你到底在说什么?这个问题是关于sql的转义.不涉及密码散列,CSRF预防,XSS预防或火灾危险预防 (4认同)
  • 绝对有一些东西接近 - 但不完全 - 相当于mysql_real_escape_string(),正如其他人在这里提到的那样.重要的是要解释为什么人们应该理解预备陈述的哲学,但是没有理由让人们只是为了让他们采用正确的做法.我发现自己需要PDO :: quote()用于兼容性目的,否则我们的代码库的大部分需要在一夜之间改变. (4认同)

Ry-*_*Ry- 27

空无一人*!PDO的目标是你不必逃避任何事情; 你只需将其作为数据发送.例如:

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

相反:

$safe_username = mysql_real_escape_string($username);
mysql_query("SELECT * FROM users WHERE username = '$safe_username' LIMIT 1;");
Run Code Online (Sandbox Code Playgroud)

*好吧,就像Michael Berkowski所说的那样!但有更好的方法.

  • 技术上有[`PDO :: quote()`](http://php.net/manual/en/pdo.quote.php),但这是正确的答案_并且它不是`mysql_real_escape_string()的直接等价物`. (12认同)
  • @Dharman:我喜欢用夸大的东西夸大难度=)好的,好的,我改了. (2认同)

Sim*_*imo 5

$v = '"'.mysql_real_escape_string($v).'"'; 
Run Code Online (Sandbox Code Playgroud)

相当于$v = $this->db->quote($v); 确保你有一个PDO实例,$this->db所以你可以调用pdo方法quote()

  • 我想在函数mysql_real_escape_string中显示等效的PDO方法,在一条指令中,方法是"quote()". (3认同)