-5

我是一个 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();
?> 
4

1 回答 1

0

正如您自己所说的菜鸟一样,没有时间像现在这样养成一些好习惯:)

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

是一个教科书式的SQL 注入漏洞示例,这段代码迟早会咬你一口。原因是您信任收到的变量,并将其交给 SQL 引擎。想象一下如果有人进入会发生什么

'); drop table users; --

作为他们的电子邮件地址...

与其设计各种复杂的方案来清理输入,有一种铁定的技术可以使您的代码免受注入攻击:准备好的语句。由于您不应该开始开发 php 提供的已弃用的 mysql_ 调用,您应该切换到 PDO 或 mysqli_。我建议 PDO,它支持准备好的语句。更多关于准备好的陈述在这里。使用 PDO 和准备好的语句,您的示例将如下所示:

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

您将拥有可以与 MySQL 以外的其他数据库系统一起使用并且不受注入攻击的未来证明代码。

于 2013-03-05T01:07:28.200 回答