为什么我的登录表单允许用户使用正确的USERNAME登录,但错误的密码? (详见)

时间:2015-08-11 09:46:57

标签: php mysql session login

我使用PHP和MySQL制作了一个登录表单。现在的问题是,当我输入正确的用户名和密码时,它会登录,但是当我输入正确的用户名并更正“密码+ ANY_OTHER_CHARACTER”时,它仍然会登录。为什么会这样?

例如: 如果存储在数据库中的用户名和密码是:

Username: username1
Password: 1213456

然后,如果我以登录表单输入这些凭据,它会将我登录。

但如果我尝试遵循凭据:

Username: username1
Password: 1213456asdfjksdj

它仍然记录我INTO SAME帐户。

为什么会这样?

还有一件事,它之前工作正常,但我使用了一些seeion变量和session_start()函数。我认为在使用会话后问题就开始了。请帮忙。

我的登录PHP代码是:

<?php
session_start();
if(isset($_SESSION["cur_user_sess"]) && isset($_SESSION["cur_user_pass"]))
{
		header("Location: welcomehome.php");
}
?>
<?php
$a=mysqli_connect('localhost', 'root','', 'onlinequiz');
if(isset ($_REQUEST['signup']))
{
$c=$_REQUEST['uname'];
$d=$_REQUEST['email'];
$e=$_REQUEST['phone'];
$f=$_REQUEST['pass'];
$h="INSERT INTO signup(Name, Email, Phone, Password) VALUES ('$c', '$d', '$e', '$f')";
$i= mysqli_query($a,$h);
if($i)
{
header("Location: login2.php");
}
else
{
echo "error";
}
}
?>
<?php
$a=mysqli_connect('localhost','root','', 'onlinequiz');
if (isset ($_REQUEST['login']))
{
$c=$_POST['mail'];

$d=$_POST['pass'];

$e="SELECT * FROM signup WHERE Email='$c' and Password='$d'";
$f=mysqli_query($a,$e);
if(mysqli_num_rows($f)==1)
{
$_SESSION["cur_user_sess"]=$c;
$_SESSION["cur_user_pass"]=$d;
header ("Location: welcomehome.php");
}
else
{
$error2 = "Enter correct information";
}
}
?>
<?php
$mysql=mysqli_connect('localhost','root','','onlinequiz');
$currentuser=$_SESSION["cur_user_sess"];

$sql = "SELECT * FROM signup WHERE Email='$currentuser'";
$result = mysqli_query($mysql, $sql);
$row = mysqli_fetch_assoc($result);
$_SESSION["profilename"]=$row["Name"];
//$_SESSION["profilepoints"]=$row["Points"];
$_SESSION["profilephone"]=$row["Phone"];
?>

2 个答案:

答案 0 :(得分:0)

您是否销毁会话或取消设置curr_user_sesscurr_user_pass

<?php
session_destroy(); // Is Used To Destroy All Sessions

//Or

if(isset($_SESSION['curr_user_sess']))
unset($_SESSION['curr_user_sess']);  //Is Used To Destroy Specified Session
if(isset($_SESSION['curr_user_pass']))
unset($_SESSION['curr_user_pass']);
?>

退出时执行此操作。如果不这样做,会话将在您正确登录后保持设置,并且您甚至无法到达检查您提供的电子邮件和密码的部分。

答案 1 :(得分:0)

首先,一些指示。

$ a,$ b,$ c?别那样做!正确的命名约定!你的SQL查询应该是&#34; $ query&#34;例如,您的MYSQLI连接可能是&#34; $ dbh&#34;或&#34; $ connection&#34;等。这使代码更容易阅读。

其次,你正在放弃&#34;未经证实的&#34;值直接进入SQL查询。为什么这么糟糕?因为如果有人输入用户名1' or '1' = '1,他们就会发现他们可以跳入整个系统。

密码?纯文本?你真的想加密那个! Here's a little article that will get you going in the right direction

接下来,出于两个原因,使用$_REQUEST通常是一个坏主意。一,基本安全,第二?代码维护。而是将其分解为$_POST$_GET,以便至少识别您的数据源。

最后但并非最不重要的是,try looking at this tutorial for PHP PDO. It's a far better way of handling DB interaction than Mysqli. More secure and less confusing, too.

尝试使用此代替您现有的测试登录信息,并告诉我它是否有效。

$mysqli = new mysqli("localhost", "user", "pass", "db");

# Basic data sanitization
$pass = mysqli_real_escape_string($_POST['email']);
$mail = mysqli_real_escape_string($_POST['pass']);

$sql = "SELECT * FROM signup "
     . "WHERE Email = '$mail' AND password = '$pass'";
$result = $mysqli->query($sql);

if($result->num_rows == 1) {
echo "Logged in";
} else {
echo "Failed to sign in";
}