2011-09-24 54 views
-1

我刚刚发现了一个非常重大的漏洞,在我的代码,同时做一些测试,防止用户具有相同的用户名

基本上,如果我的用户名是“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."; 
    } 
    ?> 
+0

因此,你想防止有人猜测你的密码? – Dani

+0

不,密码不是问题(如果它实际上是12345,那就是!!),当查询被评估时,它将接受“Admin”作为用户名,当它与用户的“admin”比较时表。 – noscript

+1

如果我理解正确,您希望查询区分大小写? http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html – Harri

回答

3

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

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

在创建用户并检查重复录入数据库中使用LCASE功能如下

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

是的,我在注册时已经这样做了 - 停止创建相同的用户名。所以你说的只是做一个调整,不允许任何一个重复的用户名变体,例如aDmIn,adMIN等 – noscript

+0

简单的是的..如果你显示用户创建代码 –

+0

感谢您的帮助,我会做对注册页面进行一些更改以禁止用户创建现有用户名的变体。谢谢 – noscript

0

你应该对你的login_name列上的唯一约束:

alter table users add constraint unique (login_name) 

那应该注意添加的新条目,这些新条目仅与案例中的现有条目不同(假设当然你使用的是default case insensitive collations)。如果你喜欢抱怨

ERROR 1062(23000):重复项“XXX”关键“LOGIN_NAME”

那么你已经有重复,你需要添加前清理那些你唯一约束。