1

PHP ログイン スクリプトを作成しましたが、機能しません。

私のコード:

<?php

function clean($str) { /* sanatize strings for databases & security */
  $str = trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysql_real_escape_string($str);
}

if (!empty($_POST['login_admin'])) {

    $username = clean($_POST['name']);
    $password = clean($_POST['password']);

      try {
        $dbh = new PDO('mysql:host=localhost;dbname=imedia', "imedia", "imedia");

        $statement = $dbh->prepare("SELECT * FROM administratori WHERE username =:username AND parola =:password");
        $statement->execute(array(":username" => $username, ":password" => md5($password)));
        $row = $statement->fetch();
        if ($row) {
            session_start("imedia_admin");
            $_SESSION['imedia_admin']['logname'] = $row['username'];
            $_SESSION['imedia_admin']['password'] = $row['password'];
            echo json_encode("success");
        } else {
            echo json_encode("error");
        }

        $dbh = null;
    } catch (PDOException $e) {
        print "Error!: " . $e->getMessage() . "<br/>";
        die();
    }
}
?>

問題はclean機能にあります。使用しない場合、私のコードは機能します。誰かが私が間違っていることを説明してもらえますか?

4

2 に答える 2

4

PDO処理します(一重引用符を自動的にエスケープするか、サニタイズします)。clean独自の関数で変数を渡さないでください。

これが何が起こっているのかです。

  • この文字列があるとしましょうhello world's day
  • あなたに関数を渡すことcleanはそれを作りますhello world''s day
  • それからそれをPDO再び逃がしてそれを作りますhello world''''s day
  • 等しくない(不一致)を引き起こすhello world's dayhello world''s day
于 2012-10-27T15:54:07.587 に答える
3

プリペアドステートメントを使用しているため、値をそれに入札するため、文字列を自分で「サニタイズ」する必要はありません。

これは、プリペアドステートメントと変数バインディングを使用することの美しさの1つです。それらは箱から出して安全です。


mysql_real_escape_string$_POST['name']( )の特殊文字をエスケープし$usernameます。これにより、データベースを検索するときに不一致が発生します(PDOを使用して渡される値は「そのまま」扱われるため)。

mysql_real_escape_stringまた、非推奨です。別の方法については、php.netを確認してください。

于 2012-10-27T15:55:24.613 に答える