2

我的本地主机上有一个简单的注册表单(仍在测试中),我想知道它是否会受到 SQL 注入的攻击?

代码:

$name = mysql_real_escape_string($_POST['name']);
$password = mysql_real_escape_string($_POST['password']);
$password = md5($password);
$email = mysql_real_escape_string($_POST['email']);
$refId = $_GET['refid'];
$ip = $_SERVER['REMOTE_ADDR'];


$add = mysql_query("INSERT INTO `users` (`name`, `password`, `email`, `refId`, `ip`)
VALUES('$name','$password','$email','$refId', '$ip')") or die(mysql_error());

那是安全的还是有人可以使用 SQL 注入(我想知道如何)?如何避免注射?

4

3 回答 3

6

避免注入的最好方法是使用Prepared Statements
对于准备好的语句,我更喜欢使用 PDO 来处理我所有的数据库内容。这是我为检索一些基本登录信息而编写的一些 PDO 示例代码:

$sql=new PDO("mysql:host=127.0.0.1;dbname=name","user","password");
        $user=$_POST[user];

        $query="select Salt,Passwd from User
                where Name=:user";
        $stmt=$sql->prepare($query);
        $stmt->bindParam(':user',$user);
        $stmt->execute();
        $dr=$stmt->fetch();        
        $sql=null; 
        $password=$_POST[pass];
        $salt=$dr['Salt'];

... ETC

阅读页面以获取有关 PDO 的更多信息。如果您想知道这里的每一行代码在做什么,请阅读我在另一篇文章中给出的答案

于 2012-07-10T17:02:39.820 回答
5

它确实很脆弱;你还没有逃脱$_GET['refid']。以这个网址为例:

yourpage.php?refid='%2C'')%3B%20DROP%20TABLE%20users%3B--

避免 SQL 注入很容易。使用准备好的语句和 PDO。例如:

$query = $dbh->prepare("INSERT INTO `users`(`name`, `password`, `email`, `refId`, `ip`)
VALUES(:name, :password, :email, :refId, :ip)");
$query->bindValue(':name', $_POST['name']);
$query->bindValue(':password', md5($_POST['password'])); # Do not use MD5 for password hashing, and especially not without salt.
$query->bindValue(':email', $_POST['email']);
$query->bindValue(':refid', $_GET['refid']);
$query->bindValue(':ip', $_SERVER['REMOTE_ADDR']);
$query->execute();
于 2012-07-10T17:00:50.567 回答
4

你没有mysql_real_escape_string$refId即使那是从$_GET. 这基本上使您的所有其他注射预防措施毫无意义。在切线上,如果您在 md5-ing 之前对密码进行转义,它会更改哈希值。

于 2012-07-10T17:02:25.870 回答