0

当我使用正确的用户名和密码登录时,我收到“错误的用户名或密码”错误,数据库连接正常,我认为密码+用户名检查有问题。

    <?php
    $host="mysql12-int.cp.hostnet.nl"; // Host name
    $username="u33936_mick"; // username
    $password="//password was correct"; // password
    $db_name="db33936_axe"; // Database name
    $tbl_name="users"; // Table name


    mysql_connect("$host", "$username", "$password");
    mysql_select_db("$db_name");



    $myusername = stripslashes($myusername);
    $mypassword = stripslashes($mypassword);
    $myusername = mysql_real_escape_string($myusername);
    $mypassword = mysql_real_escape_string($mypassword);
    $sql = 'SELECT * FROM `users` LIMIT 0, 30 WHERE username="$myusername" and        
    password="$mypassword"';
    $result=mysql_query($sql);


    $count=mysql_num_rows($result);



    if($count==1){
      session_register("username");
      session_register("password");
      header("location:index.php");
    } else {
      echo "Wrong Username or Password";
    }
    ?> 

这是我的表格

     <form name="login" method="post" action="login.php">
                <fieldset id="inputs">
                    <input id="myusername" type="text" name="myusername"    
    placeholder="Username" required="">  
                    <input id="mypassword" type="password" name="mypassword"      
    placeholder="Password" required="">
                </fieldset>
                <fieldset id="login.php">
                    <input type="submit" id="submit" value="Login">
    </style>
                </fieldset>
            </form>
4

2 回答 2

7

最重要的是,我建议您考虑从已弃用mysql_*的函数系列过渡到支持mysqli( docs ) 或 PDO ( docs ),就代码而言,这两者都不需要您进行任何重大更改。

至于您的特定错误,您似乎错误地将值连接到查询中。此外,您的WHEREandLIMIT订单是不正确且无效的 SQL。这是正确的形式:

$sql = '
    SELECT 
        * 
    FROM 
        `users` 
    WHERE 
        username="'.$myusername.'" AND 
        password="'.$mypassword.'"
    LIMIT 0, 30 
';

目前尚不清楚使用该LIMIT语句会带来什么好处。要么你应该有一个匹配的行,要么没有。如果有的话,我会使用LIMIT 1. 如果你有 30 行回来,你会用它们做什么!?

转换为 PDO 很容易!PDO 中的相同查询如下所示:

$host="mysql12-int.cp.hostnet.nl"; // Host name
$username="u33936_mick"; // username
$password="//password was correct"; // password
$db_name="db33936_axe"; // Database name

$pdo = new PDO('mysql:host='.$host.';dbname='.$db_name, $username, $password);
$sth = $pdo->prepare('
        SELECT 
            * 
        FROM 
            `users` 
        WHERE 
            username=:username AND 
            password=:password
        LIMIT 0, 30 
');
$sth->execute(array('username'=>$myusername, 'password'=>$mypassword));
$user = $sth->fetch();

请注意,当您使用带有绑定参数的 PDO(此处显示)时,您不必像在代码中所做的那样mysql_real_escape_string进行清理。addSlashes

目前尚不清楚您在哪里定义$mypassword$myusername,但是如果您使用已注册的全局变量,那么您应该更改您的代码。直接从 中获取值$_POSTaddSlashes是不安全的,也不是注册的全局变量。

文档

于 2013-06-27T20:48:48.963 回答
2

几个问题:

  • 您应该使用$_POST['myusername']etc. 来获取发布的变量。如果您依赖它register_globals,则应将其关闭,因为它已被弃用并存在安全风险;
  • LIMIT子句在mysql的末尾;
  • 您不应该使用类似函数stripslashes和转义函数来修改发送的信息,而是应该在 PDO / mysqli 中使用带有绑定变量的准备好的语句,因为mysql_*不推荐使用这些函数并且密码可以包含例如斜杠。

作为旁注,您真的应该对密码进行加盐和哈希处理,不要在数据库中存储纯文本密码。

于 2013-06-27T20:50:20.433 回答