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を使用することです。
準備済みステートメントの場合、すべての DB を処理するために 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 の詳細については、このページを参照してください。ここにあるコードの各行が何をしているのか知りたい場合は、私が別の投稿に与えたこの回答を読んでください。

于 2012-07-10T17:02:39.820 に答える
5

それは確かに脆弱です。あなたは逃げていません$_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();
于 2012-07-10T17:00:50.567 に答える