我一次又一次地读到Stackoverflow,我应该使用PDO来访问MySQL,因为它更安全。我最近使用一些在线教程将一些select和insert语句更改为PDO,并发现它们与我的原始代码非常相似。这让我觉得也许我错过了一些东西。
所以,我的问题是what makes PDO safer than normal mysql
?有什么能使这些例子更安全吗?
编辑:我已粘贴下面的插入代码。如果您能看到一些让它更安全的方法,请告诉我。
include 'dataB3S3.php';
try {
$dbh = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password);
/*** connect to DB ***/
/*** INSERT data ***/
$count = $dbh->exec("INSERT INTO $table(`instance` ,`uid`,`teid`) VALUES (NULL,'$userID','$teid')");
/*** display the id of the last Auto INSERT ***/
$lastInsertValue=$dbh->lastInsertId();
/*** close the database connection ***/
$dbh = null;
}
答案 0 :(得分:5)
你错过了一个主要的好处,prepared statements。使用它们而不是直接在查询中嵌入变量就像示例代码一样,可以更好地防止意外的SQL注入漏洞。
答案 1 :(得分:1)
是。 ceejayoz有一个很好的观点,但对我来说,除了过滤和清理数据之外,PDO
实际上可以将生成的数据集注入完整的成熟对象中。
我从this awesome SO post了解了一段时间。
为了有一个代码示例,我将在这里粘贴电子满意代码,因为我手边没有可用的代码示例,但相信我,我已多次借用这个概念:
class Student {
public $id;
public $first_name;
public $last_name
public function getFullName() {
return $this->first_name.' '.$this->last_name
}
}
try
{
$dbh = new PDO("mysql:host=$hostname;dbname=school", $username, $password)
$stmt = $dbh->query("SELECT * FROM students");
/* MAGIC HAPPENS HERE */
$stmt->setFetchMode(PDO::FETCH_INTO, new Student);
foreach($stmt as $student)
{
echo $student->getFullName().'<br />';
}
$dbh = null;
}
catch(PDOException $e)
{
echo $e->getMessage();
}
并不是说我是ZF爱人,但是Zend Framework实际上在他们的抽象中使用了非常棒的PDO。查看ZEND_DB_相关类,了解与有价值的库一起使用时PDO的强大功能。
作为奖励,大多数(如果不是全部)此框架的类都可以独立运行或作为模块化组件运行。我自己在小项目中使用了很多这些项目,它们的库实际上非常易于使用和记录良好,并且在许多环境中进行了大量的尝试和测试。
快乐的编码!