2012-11-13 39 views
2

我在学习PDO的基础知识。我已经构建了以下内容将数据插入到表中,但是我想获得关于这是否安全或者是否可以做得更好的反馈?安全表数据录入PHP/PDO/MySQL

我的后期变量是否需要像mysql_real_escape_string()那样转义?

$firstname = $_POST['First_Name']; 
$surname = $_POST['Surname']; 
$nicknames = $_POST['Nicknames']; 
$age = $_POST['Age']; 


// Connection data (server_address, database, name, poassword) 
$hostdb = 'localhost'; 
$namedb = 'tsite_co_uk'; 
$userdb = '[email protected]'; 
$passdb = 'password'; 

try { 
    // Connect and create the PDO object 
    $conn = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb); 
    $conn->exec("SET CHARACTER SET utf8");  // Sets encoding UTF-8 
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

    // Define an insert query 
    $sql = "INSERT INTO `directory` 

    (`First_Name`,`Surname`,`Nicknames`,`Age`) 

    VALUES ('$firstname','$surname','$nicknames','$age') 

    "; 

    $count = $conn->exec($sql); 

    $conn = null;  // Disconnect 
} 
catch(PDOException $e) { 
    echo $e->getMessage(); 
} 
+0

一个更好的地方要问这样的问题是http://codereview.stackexchange.com/。这就是说,没有......不安全。学习如何使用预处理语句:http://php.net/manual/en/pdo.prepared-statements.php –

回答

1

这是不安全的 - you're什么都不做,以防止SQL注入从用户提供的$ _ POST值。您应该使用准备好的语句和瓦莱斯绑定到他们:

$conn = new PDO("mysql:host=$hostdb; dbname=$namedb", $userdb, $passdb); 
$conn->exec("SET CHARACTER SET utf8");  // Sets encoding UTF-8 
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$sql = "INSERT INTO `directory` (`First_Name`,`Surname`,`Nicknames`,`Age`) 
    VALUES (:firstname ,:surname,:nicknames ,:age) "; 

$statement = $conn->prepare($sql); 
$statement->bindValue(":firstname", $firstname); 
$statement->bindValue(":surename", $surename); 
$statement->bindValue(":nicknames", $nicknames); 
$statement->bindValue(":age", $age); 

$count = $statement->execute(); 
+0

感谢@ray,我仍然需要首先使用我的post值定义$ firstname等变量吗? $ firstname = $ _POST ['First_Name']; $ surname = $ _POST ['Surname']; $ nicknames = $ _POST ['Nicknames']; $ age = $ _POST ['Age']; – Liam

+1

@Liam是的,我正在完成连接创建之前的所有事情。而且,这全部在try/catch块内部。 – Ray