当前位置: 首页 > 面试题库 >

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

顾兴昌
2023-03-14
问题内容

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


问题答案:

好吧,没有!

从技术上讲, 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); 
 }

现在,您可能已经知道,我还没有使用任何东西来转义/消毒的值$_POST["color"]。借助PDO和预准备语句的强大功能,此代码可安全地防止myql注入。

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

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

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

最后但并非最不重要的,还有时候,你不应该相信PDO
100%,并且将必然会采取一些额外措施,以防止SQL注入,是,如果你使用的是MySQL的一个过时版本的那些情形之一[ mysql =< 5.3.6]的描述

但是,使用上述所示的预处理语句总是比使用以开头的任何功能更安全。 mysql_



 类似资料:
  • 问题内容: LINQ的Java等效项是什么? 问题答案: 现在使用Java 8向我们介绍了Stream API,这在处理集合时是类似的事情,但与Linq不太一样。 如果它是您正在寻找的ORM,例如Entity Framework,那么您可以尝试Hibernate

  • 问题内容: 有Swift的等效项吗?在中,我们通常使用: 如何在Swift中实现相同目标?我发现了一个功能: 但是,它很长,根本不方便。 问题答案: 将在斯威夫特的世界同样存在。 的,和参数均标有 该装置的同时调用该函数我们可以忽略这些参数的关键字。在这种情况下,将使用其默认值。 这得出一个结论,该方法调用可以简化为: Swift 5- 没什么变化,仍然可以这样工作。

  • 问题内容: 在Objective-C中,我使用以下代码删除所有子视图: 但是如何迅速使用它呢?我看到苹果文档迅速使用了该方法 但是当我尝试它时,出现错误: 有什么方法可以快速删除子视图? 问题答案: 已针对Swift 2.0(Xcode 7)更新 用途: 或像这样:

  • 问题内容: 在TSQL中,我可以声明: 在MySQL中,我无法编写相同的查询。 在MySQL中编写此查询的正确方法是什么? 问题答案: 行尾的分号。

  • 问题内容: PHP具有 var_dump()函数,该函数输出对象的内部内容,显示对象的类型和内容。 例如: 将输出: Java中将执行相同操作的等效项是什么? 问题答案: 它不是Java中的嵌入式程序,因此您不会免费获得它。 它是通过约定而不是语言构造完成的。在所有数据传输类中(甚至 在您编写的所有类中…… ),您都应该实现一个明智的方法。因此,这里您需要在您的类中重写并返回所需的状态。 有一些实

  • 我正在研究promsies和async/await的用法。 我编写了以下代码,它执行以下操作: 它获取一些数据库数据(使用Knex.js), 处理该数据, 将处理的数据分配到指定的属性中 这3个步骤执行了多次(在下面的代码中,执行了两次),并且始终等待执行: 现在,我正在尝试编写与等效的promise链,这就是我想到的: 但这不太管用。发生的是,在第一个返回之后,中的结束了它的等待,这导致返回-并