-2

ログイン機能に問題があります。何時間も探しましたが、問題は見つかりませんでした。皆さんが私を助けてくれることを願っています。ユーザーのログインを取得し、DB に存在するかどうかを確認したい。問題は、「パスワードが間違っている可能性があります!」というメッセージが何度も返ってくることです。「echo ($count)」を試しましたが、何も返されません。「echo($result)」も同様です。

私はかなり迷っています。なぜこれが機能しないのか理解できません...

PS : 私はフランス人なので、フランス語の単語が表示される場合があります。

これが私のログインフォームです:

<?php
   session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>  
    <meta charset="utf-8" />
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Applications</title>
    <!--Chargement des feuilles de style-->
    <link rel="stylesheet" type="text/css" href="./css/style.css" />
    <link rel="stylesheet" type="text/css" href="./css/styleLogin.css" />
    <script src="./js/login/modernizr.custom.63321.js"></script>    
</head>
<body>
    <div class="container">


        <header></header>

        <section class="main">
            <form class="form-2" id="loginForm" action="./controller/checkLogin.php" method="post">
                <h1><span class="log-in">Se connecter</span></h1>
                <p class="float">
                    <label for="loginLabel"><i class="icon-user"></i>Nom d'utilisateur</label>
                    <input type="text" name="login" id="login">
                </p>
                <p class="float">
                    <label for="passwordLabel"><i class="icon-lock"></i>Mot de passe</label>
                    <input type="password" name="password" class="showpassword" id="password">
                </p>
                <p class="clearfix">    
                    <input type="submit" name="submit" value="Se connecter">
                    <input type="button" name="submitVisit" value="Accès utilisateur">
                </p>
            </form>​​
        </section>

    </div>
</body>

そして、これが私の checkLogin.php です:

<?php

session_start();

try {           
    $bdd = new PDO('mysql:host=localhost;dbname=stage','root','');
  }
  catch (Exception $e){ //en cas d'erreur de connexion, afficher le message           
    die('Erreur : '.$e->getMessage());
  }

if(isset($_POST['submit'])){
    // username and password sent from form 
    $login = $_POST['login'];
    $pass = $_POST['password'];

    $qry = "SELECT login FROM users WHERE login = 'admin'";
    $result = mysql_query($qry);


    // Mysql_num_row is counting table row
    $count = mysql_num_rows($result);

    if($count == 0){
        die("Password was probably incorrect!");
    }
    // If result matched $myusername and $mypassword, table row must be 1 row
    elseif($count == 1){

        // Register $myusername, $mypassword and redirect to file "login_success.php"
        $_SESSION['login'] = $login;
        header("location: ./login_success.php");
    }

    else {
        echo "Wrong Username or Password";
    }
}

mysql_close($bdd);
?>

このカップルでログインしたい:管理者/管理者。

前もって感謝します。

4

4 に答える 4

2

スクリプトにはいくつかの問題があります。

まず、PDO を使用してデータベースに接続することから始め、次にmysql_*関数を使用します (これは非推奨であり、PDO に固執します!!!)。さらに、データを適切にエスケープしていないため、コードが SQL インジェクションに対して脆弱になる可能性があります。

第二に、使用しているクエリは...良くありません。

// this is not checking for either the user input data !!!
$qry = "SELECT login FROM users WHERE login = 'admin'"; 

確認コードは次のようになります。

$ps = $bdd->prepare("SELECT COUNT(*) FROM users WHERE login = :login AND pass = :password");
$params = array("login" => $_POST['login'], "password" => $_POST['password']);
$ps->execute($params);

$status = (bool) $ps->fetchColumn(0);

if ($status) {
    // login successful
} else {
    // login failed
}  

PDO準備済みステートメントを読んでください(これらは自動的にデータをエスケープするため、その必要はありません)。

ノート:

将来のコードで準備済みステートメントを使用しない場合は、ユーザーやその他の情報源からの入力を常にエスケープすることを忘れないでください。

于 2013-04-11T07:44:25.090 に答える
0

みんなが一般的な問題についてアドバイスをくれたので、私は本題に切り込みました

変化する:

    $login = $_POST['login'];
    $pass = $_POST['password'];

    $qry = "SELECT login FROM users WHERE login = 'admin'";

パスワードが「passwort」という名前のデータベースフィールドに保存されていると仮定すると、次のようになります。

        $login = $_POST['login'];
        $pass = $_POST['password'];

        $qry = "SELECT login FROM users WHERE login = '".mysql_real_escape_string($login)."' and password= '".mysql_real_escape_string($password)."'";

mysql_real_escape_string はハッキングされるのを防ぎ、データベース クエリは投稿からの値を使用するようになりました ...

于 2013-04-11T07:52:22.723 に答える
-1

問題は、mysql_* 関数と PDO を混在させていることです。コードは次のようになります。

パラメーターを SQL クエリにバインドする prepare 関数に注意してください。これにより、SQL インジェクションが防止されます。

session_start();

try {           
    $pdo = new PDO('mysql:host=localhost;dbname=stage','root','');
  }
  catch (Exception $e){ //en cas d'erreur de connexion, afficher le message           
    die('Erreur : '.$e->getMessage());
  }

if(isset($_POST['submit'])){
    // username and password sent from form 
    $login = $_POST['login'];
    $pass = $_POST['password'];

    $sql = "SELECT login FROM users WHERE login = :login AND password = :password";
    $params = array( 'login' => $login, 'password' => $pass );
    $sqlprep = $pdo->prepare($sql);

    if($sqlprep->execute($params)) {
        $count = $sqlprep->rowCount();
        if($count != 1){
            die("Incorrect login!");
        } else {
            $_SESSION['login'] = $login;
            header("location: ./login_success.php");
        }
    }
}
于 2013-04-11T07:51:08.260 に答える