2013-03-05 85 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之外的数据库系统中,这就是免疫注入攻击。