阻止用户使用相同的用户名

时间:2011-09-24 06:06:44

标签: php mysql login

我在执行某些测试时发现了一个非常重要的漏洞,

基本上,如果我的用户名是“admin”,密码是“12345”... 并且用户加入并选择了名称“Admin”和相同的密码“12345” 当他/她登录时,他们将在我的网站上,你可以想象我创造了一个很大的缺陷,因为这会影响网站上的每个潜在用户。

所以,我的问题是我可以在此声明中更改哪些内容,以便检查是否存在完全匹配。

   WHERE login_name ='$user' AND user_password ='$pass' LIMIT 1";  

继承了login_process.php文件

    <?php
    require_once("includes/session.php");
    $connection = mysql_connect("localhost", "user", "password");
    if(!$connection)
    {
        die("Database connection failed: " . mysql_error());
    }
    $db_select = mysql_select_db("game", $connection);
    if(!$db_select)
    {
        die("Database selection failed: " . mysql_error());
    }
    $user = mysql_real_escape_string($_POST['username']);
    $pass = mysql_real_escape_string($_POST['password']);
    $pass = sha1($pass);

    // Need to make a change to the below query, as it doesn't match for case sensitivity.

    $query = "SELECT user_id, user_name, user_level FROM users WHERE login_name ='$user' AND user_password ='$pass' LIMIT 1";
    $result=mysql_query($query);
    if(mysql_num_rows($result) == 1)
    {
        $found_user = mysql_fetch_array($result);
        $_SESSION['user_id'] = $found_user['user_id'];
        $_SESSION['user_name'] = $found_user['user_name'];
        $_SESSION['user_level'] = $found_user['user_level'];
        header("Location: index.php");
    }
    else 
    {
        echo "The username or password you entered was incorrect. <br/> Please click <a href='login.php'>Here</a> to try again.";
    }
    ?>

2 个答案:

答案 0 :(得分:3)

数据库的默认排序规则不区分大小写。所以用户admin和Admin或adMin是相同的。创建用户时检查数据库是否已存在相同的用户名。

您似乎使用区分大小写的排序规则..您可以对该用户表使用不区分大小写的排序规则,以便您的查询可以正常工作。

创建用户并检查数据库是否有重复条目使用LCASE函数如下

SELECT * FROM USERS WHERE LCASE(username) = 'admin'

答案 1 :(得分:0)

您的login_name列应该有一个UNIQUE约束:

alter table users add constraint unique (login_name)

这应该照顾添加的任何新条目,这些条目仅与现有条目不同(当然假设您正在使用default case insensitive collations)。如果你收到像

这样的抱怨
  

错误1062(23000):对于“login_name”键重复输入“XXX”

然后你已经有了重复项,你需要在添加UNIQUE约束之前清理它们。