我当前的登录表单无法正常运行。无论登录表单中输入什么内容,它始终会记录我。从第一个问题开始,我决定改变我的代码。
以下是最新代码:
<?php
session_start();
include_once("db_connect.php");
if(isset($_POST['loginSub'])) {
//Connect to DB
include_once("db_connect.php");
//Gets whatever is inside input box and prevents sql injection
$username=($_POST['user']);
$password=($_POST['password']);
$query = "SELECT * FROM user WHERE user= 'kent' AND password = 'password'";
$rows = mysqli_query($conn, $query);
if ($rows->num_rows == 1) {
$_SESSION['user']=$username; // Initializing Session
header("location: loginAuth.php"); // Redirecting To Other Page
} else {
$error = "Username or Password is invalid!!!!";
}
mysql_close($conn); // Closing Connection
}
&GT;
以下是HTML表单:
<form id="login" method="POST" action="loginAuth.php">
<label for="user"><strong>Login:</strong></label>
<input type="text"size=20 autocorrect=off autocapitalize=words name="user">
<!--<label for="loginPassword" name="password"> <strong>Password:</strong></label>
<input type="password" name="Password"> -->
<label for="password" > <strong>Password:</strong></label>
<input type="password" name="password">
<input name="loginSub" type="submit" value="login">
</form>
表单操作loginAuth.php
基本上会将您带到编辑器页面并且还没有php。
每段代码都来自同一个php页面。我的问题是,如何在凭据不正确的情况下将其登录?
答案 0 :(得分:2)
mysqli_real_escape_string
需要连接参数,否则它将为空白:
$username = mysqli_real_escape_string($db, $username);
$password = mysqli_real_escape_string($db, $password);
由于这两个变量都是空白的,因此您的查询将自动计算为true
。
此外,您不需要mysqli_query
的引号:
$query = mysqli_query($db,$sql);
您还需要指定POST方式的表单方法:
<form id="login" method="POST" action="loginAuth.php">
这是因为您使用$_POST
获取PHP中的数据:
当使用application / x-www-form-urlencoded或multipart / form-data作为请求中的HTTP Content-Type时,通过HTTP POST方法传递给当前脚本的关联变量数组。
$username=strip_tags($_POST['user']);
$password=strip_tags($_POST['password']);
只是提示:您不应该存储用户&#39;密码为纯文本,你应该哈希/加密它。
在PHP 5.5中,有一个密码哈希函数:http://php.net/manual/en/ref.password.php。
更新逻辑:
$sql = "SELECT * FROM users WHERE username='$username' AND password='$password' LIMIT 1";
$query = mysqli_query($db, $sql);
$result = mysqli_result($query);
if(mysqli_num_rows($result) > 0) {
$_SESSION['username']= $username;
$_SESSION['id']= $id;
//useless code doesnt work header('Location: editor.php');
// { other code }
答案 1 :(得分:1)
你的第一个错误是你没有指定表单方法,如果你没有从方法中指定它应该总是$_GET
,但你正在检查$_POST
所以首先请指定表单方法,这是你的登录页面所以我的建议为了安全起见,在表单标记中设置post方法。
<form id="login" action="loginAuth.php" method="post">
然后尝试它可以帮助你。
答案 2 :(得分:1)
总结其他答案并改进代码:
在表单中,您需要设置方法。因此<form id="login" action="loginAuth.php">
变为<form id="login" action="loginAuth.php" method="post">
改进表单HTML:
<div id="loginform">
<form id="login" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<label for="username"><strong>Username:</strong></label>
<input type="text" size=20 autocorrect="off" autocapitalize="words" name="username" id="username">
<label for="password" name="password"><strong>Password:</strong></label>
<input type="password" name="password" id="password">
<input name="loginSub" type="submit" value="login">
</form>
</div>
注意为了使标签可以点击,
for
属性需要与输入的id
属性相匹配。 Alname
属性需要与$_POST
的名称相匹配。这两种形式都不正确。
要缩短代码并使其更易于维护,请使用以下命令:
首先代替if(isset($_POST['loginSub'])) {
,您也可以说if( $_POST )
这样可以确保其余代码仅在页面发布时执行。
要进一步缩短代码,而不是在单独的行上执行所有sql注入预防,您可以将它们合并为一个。这使维护更容易。
$username = mysqli_real_escape_string($db, stripslashes( strip_tags( $_POST['username'] ) ) );
$password = mysqli_real_escape_string($db, stripslashes( strip_tags( $_POST['password'] ) ) );
另外,不要忘记将数据库连接添加到mysqli_real_escape_string()
。
查看用户名和密码组合是否匹配
$sql = "SELECT * FROM `users` WHERE `username`= '$username' AND `password` = '$password' LIMIT 1";
注意每个列名称周围的反引号。反引号是为了防止一个名为mysql保留字的错误。尽管列名称不是保留字,但一般来说最好使用它们。
要执行查询,您不需要引号。因此$query = mysqli_query("$db,$sql");
变为$query = mysqli_query($db, $sql);
之后你就可以做到:
$query = mysqli_query($db, $sql);
if( $query ) {
if( mysqli_num_rows( $query ) >= 1 ) {
$_SESSION['username'] = base64_encode( $username );
header('Location: home.php');
exit(); // To prevent further exection of code
} else {
echo "Incorrect details.Try again!";
}
} else {
echo "Error in query";
}
base64_encode
使得阅读会话变得更加困难。使用base64_decode()
阅读
注意您不应该使用
password_hash()
和password_verify()
这样的函数以纯文本格式存储密码。
您也不应该只使用md5()
,因为它很容易破解。你可以做的是组合使用。像下面的东西。这些只是你能做的两个例子,我不是说一个比另一个好。只是不要单独使用md5()
。
$password = password_hash( md5( $password) );
$password = password_hash( hash('sha512', sha1( md5( $password ) ) );
答案 3 :(得分:0)
首先,查询应检查用户名和密码。它应该是这样的:
$sql = "SELECT * FROM users WHERE username = '$username' and password = '$password'";
然后检查结果以查看您是否没有获得任何记录,然后显示“无效凭据”之类的消息。如果不是,您应该重定向或显示您想要的部分。
答案 4 :(得分:0)
一些快速解决方法可能是:
1)指定形成method="POST"
2)mysqli_real_escape_string
需要两个参数。有关详细信息,请查看this link。更改以下代码
来自
$username = mysqli_real_escape_string($username);
$password = mysqli_real_escape_string($password);
到
$username = mysqli_real_escape_string($db, $username);
$password = mysqli_real_escape_string($db, $password);
3)将$query = mysqli_query("$db, $sql");
更改为$query = mysqli_query($db, $sql);
4)同时检查更新的查询以检查用户名和密码。
<?php
session_start();
include_once("db_connect.php");
if(isset($_POST['loginSub']))
{
//Connect to DB
include_once("db_connect.php");
//Gets whatever is inside input box and prevents sql injection
$username = strip_tags($_POST['user']);
$password = strip_tags($_POST['password']);
//Gets whatever is inside input box and prevents sql injection
$username = stripslashes($username);
$password = stripslashes($password);
//Gets whatever is inside input box and prevents sql injection
$username = mysqli_real_escape_string($db, $username);
$password = mysqli_real_escape_string($db, $password);
// Look in users table and filter those who have same username is the one inputed.
$sql = "SELECT id, username FROM users WHERE username = '$username' and password = '$password' ";
$query = mysqli_query($db, $sql);
if($query)
{
if(mysqli_num_rows($query) == 1)
{
$_SESSION['username']= $username;
$_SESSION['id']= $id;
header('Location: home.php');
}
else
{
echo "Incorrect details.Try again!";
}
}
else
{
echo "Error in query";
}
}
?>
<div id="loginform">
<form id="login" action="loginAuth.php" method="POST">
<label for="login"><strong>Login:</strong></label>
<input type="text"size=20 autocorrect=off autocapitalize=words name="user">
<label for="loginPassword" name="password"> <strong>Password:</strong></label>
<input type="password" name="Password">
<input name="loginSub" type="submit" value="login">
</form>
</div>