我理解通过使用预准备语句来保护数据库免受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.
归档时间: |
|
查看次数: |
17839 次 |
最近记录: |