-2

我的登录功能有些问题。我一直在寻找几个小时,我找不到任何问题。我希望你们能帮助我。我想获取用户的登录信息并检查它是否存在于我的数据库中。问题是它一直返回我:“密码可能不正确!”。我尝试了一个“echo ($count)”,它没有返回任何东西。“回声($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);
?>

我想用这对夫妇登录:admin/admin。

先感谢您。

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

1)您正在混合使用 mysql 和 PDO,这是一场灾难。不推荐使用 mysql_ 接口 请使用 mysqli 或 pdo...

2)

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

只找到登录管理员的用户......所以你必须

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

3) $_POST 变量不安全。用户可以注入恶意代码...

例如如果你使用 mysqli 那么

$login = mysqli_real_escape_string($_POST['login']);

清理登录条目并对密码执行相同操作。

于 2013-04-11T07:43:53.547 回答
0

因为每个人都对一般问题提出了建议,所以我切入正题

改变:

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

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

假设密码 ist 保存到名为“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 回答