2013-03-05 113 views
-5

我是一個完整的PHP noob,雖然我閱讀了關於MySQL注入和保護我的腳本,但我想我會發布我迄今爲止在這裏的內容。保護PHP免受MySQL注入

下面是我目前的(工作,但不好的做法)代碼。有人可以提供我的弱點,我可以做些什麼來解決?

<?php 
require_once 'login.php'; //database information 

$db_server = mysql_connect($db_hostname, $db_username, $db_password) 
    or die("Unable to connect to MySQL: " . mysql_error()); 

mysql_select_db($db_database) 
    or die("Unable to select database: " . mysql_error()); 

$email = $_POST['email']; 

$sql="INSERT INTO users (email) 
VALUES ('$email')"; 

$result = mysql_query($sql); 

if($result){ 
header('Location: ../thankyou.php'); 
} 
else { 
echo "ERROR"; 
} 

mysql_close(); 
?> 
+2

警告 此擴展(mysql_query)自PHP 5.5.0起棄用,並且將來會被刪除。相反,應該使用MySQLi或PDO_MySQL擴展。另請參閱MySQL:選擇API指南和相關FAQ以獲取更多信息。此功能的替代方法包括:mysqli_query() PDO :: query()http://php.net/manual/en/function.mysql-query.php – Patashu 2013-03-05 00:55:50

回答

0

正如你在你自己的話是一個小白沒有時間像現在拿起一些良好的生活習慣:)

$email = $_POST['email']; 
$sql="INSERT INTO users (email) VALUES ('$email')"; 

SQL injection漏洞的一個典型例子,這個代碼遲早會bite you。原因是您信任您收到的變量,並將其交給SQL引擎。試想一下,如果有人進入

'); drop table users; --

他們的電子郵件地址會發生什麼......

而是制定各種複雜的方案來清理輸入的,有一個鐵定的技術,使您的代碼的免疫反對注射攻擊:準備好的陳述。由於您不應該開始開發由php提供的棄用mysql_調用,因此應該切換到PDO或mysqli_。我會建議PDO,它支持準備好的語句。更多關於準備陳述here。使用PDO和準備statments,您的樣品將是這樣的:

$stmt = $dbh->prepare("INSERT INTO users (email) VALUES (:email)"); 
$stmt->bindParam(':email', $email); 
$stmt->execute(); 

您將有面向未來的代碼,已經準備好與MySQL之外的數據庫系統中,這就是免疫注入攻擊。