我在执行某些测试时发现了一个非常重要的漏洞,
基本上,如果我的用户名是“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 :(得分: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约束之前清理它们。