我使用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"];
?>
答案 0 :(得分:0)
您是否销毁会话或取消设置curr_user_sess
和curr_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
,以便至少识别您的数据源。
尝试使用此代替您现有的测试登录信息,并告诉我它是否有效。
$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";
}