在PHP中,PDO如何防止SQL注入?准备好的陈述如何运作?

JDe*_*age 13 php security pdo

我理解通过使用预准备语句来保护数据库免受SQL注入的正确方法.我想了解准备语句如何保护我的数据库.

首先,准备好的语句与"参数化查询"相同吗?

作为一个例子,我粘贴在我的代码下面,以便在用户表中插入新用户.这样安全吗?PDO如何确保其安全?还有什么需要做的,以保护数据库免受注入?

在'Class_DB.php'中:

class DB {
 private $dbHost;
 private $dbName;
 private $dbUser;
 private $dbPassword;   
 function __construct($dbHost, $dbName, $dbUser, $dbPassword) {
  $this->dbHost=$dbHost;
  $this->dbName=$dbName;
  $this->dbUser=$dbUser;
  $this->dbPassword=$dbPassword;
 }
 function createConnexion() {
  return new PDO("mysql:host=$this->dbHost;dbName=$this->dbName", $this->dbUser, $this->dbPassword);
 }
}
Run Code Online (Sandbox Code Playgroud)

在'DAO_User.php'中:

require_once('Class_DB.php');

class DAO_User {
 private $dbInstance;
 function __construct($dbInstance){
  $this->dbInstance=$dbInstance;
 }
 function createUser($user){
  $dbConnection=$this->dbInstance->createConnexion();
  $query=$dbConnection->prepare("INSERT INTO users (userName, hashedPassword, userEmail) VALUES (?,?,?)");
  $query->bindValue(1, $user->userName);
  $query->bindValue(2, $user->hashedPassword);
  $query->bindValue(3, $user->userEmail);
  $query->execute();
 }
}
Run Code Online (Sandbox Code Playgroud)

谢谢,

JDelage

JDe*_*age 24

好的,我在这个相关问题中找到了我的问题的答案:PDO准备好的语句是否足以阻止SQL注入?

感谢Haim指出这个Q给我.

在非技术术语中,以下是准备语句如何防止注入:

将查询发送到数据库时,通常将其作为字符串发送.db引擎将尝试解析字符串并将数据与指令分开,依赖于引号和语法.因此,如果您发送"SELECT*WHERE"用户提交的数据'EQUALS'表行名称',引擎将能够解析该指令.

如果您允许用户输入将在"用户提交的数据"中发送的内容,那么他​​们可以在此类型中包含"..."或"如果1 = 1 ERASE DATABASE".数据库引擎将无法解析此问题并将将上述内容作为指令而不是无意义的字符串.

PDO的工作方式是单独发送指令(prepare("INSERT INTO ...))和数据.数据单独发送,清楚地理解为仅数据和数据.db引擎甚至不尝试分析数据字符串的内容以查看它是否包含指令,并且不考虑任何可能具有破坏性的代码snipet.

  • 我知道这是一个陈旧的答案,但这应该在PHP和数据库的每个入门级教科书中.非常清楚,易于理解! (2认同)