簡體   English   中英

注冊表格中避免使用SQL注入

[英]Avoid SQL injection in registration form php

我在localhost上有一個簡單的注冊表單(仍在測試),我想知道它是否可以被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注入(我想知道如何)? 我怎樣才能避免注射?

避免注射的最佳方法是使用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'];

......等

有關PDO的更多信息,請閱讀頁面。 如果你想知道的每一行代碼這里是干什么的,看這個答案我給了另一篇文章。

它確實很脆弱; 你沒有逃過$_GET['refid'] 以此URL為例:

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();

你沒有mysql_real_escape_string $refId ,即使這是從$_GET 這基本上使你所有其他注射預防措施都沒有實際意義。 在切線上,如果在md5之前轉義字符串密碼,則會更改散列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM