php登录页面 - 当我插入有效数据时它不起作用,但是当我插入无效数据时它完美地工作[重复]
Posted
技术标签:
【中文标题】php登录页面 - 当我插入有效数据时它不起作用,但是当我插入无效数据时它完美地工作[重复]【英文标题】:php login page - when I insert valid data it does not work, but when I insert invalid data it works perfectly [duplicate] 【发布时间】:2019-04-20 11:54:05 【问题描述】:我有问题。我正在建立自己的登录页面,但遇到了一些麻烦。当我测试我的页面并插入无效的用户名和密码代码时效果很好。但是当我插入数据库中存在的数据时,它只会跳过if(isset($_POST['but_submit']))
部分。这里有什么问题?
这是我的代码:
php:
<?php include ("config.php");
if(isset($_POST['but_submit']))
$uname = mysqli_real_escape_string($con,$_POST['txt_uname']);
$password = mysqli_real_escape_string($con,$_POST['txt_pwd']);
if ($uname != "" && $password != "")
$sql_query = "select count(*) as cntUser from users where Username='".$uname."' and passwrd='".$password."'";
$result = mysqli_query($con,$sql_query);
$row = mysqli_fetch_array($result);
$count = $row['cntUser'];
if($count > 0)
$_SESSION['uname'] = $uname;
header('Location: welcome.php');
else
echo "Invalid username and password";
?>
<div class="container">
<form method="post" action="">
<div id="div_login">
<h1>Login</h1>
<div>
<input type="text" class="textbox" id="txt_uname" name="txt_uname" placeholder="Username" />
</div>
<div>
<input type="password" class="textbox" id="txt_uname" name="txt_pwd" placeholder="Password"/>
</div>
<div>
<input type="submit" value="Submit" name="but_submit" id="but_submit" />
</div>
</div>
</form>
</div>
我真的很高兴有人可以帮助我 :) 谢谢!
【问题讨论】:
skips if(isset($_POST['but_submit']))
是什么意思?你没有输出?您不应该存储纯文本密码。
header('Location: welcome.php');
后面需要exit();
当我插入有效数据时,程序在if(isset($_POST['but_submit']))
给出错误。是的,我知道我不应该这样存储密码。我会在发现这里出了什么问题后更改它...谢谢
Jaquarh,谢谢,还是不行。
mysqli_error($con)
将其添加到查询后返回什么?以及 PHP 的错误报告。 php.net/manual/en/function.error-reporting.php @Gandalf 旁注:使用@the_member_name
直接ping。
【参考方案1】:
也许这会起作用?如果有字段缺失,请先调试,然后执行 SQL。
require_once 'config.php';
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
if (mysqli_connect_errno()) die(mysqli_connect_error());
# Debug what the issue is
foreach(array('but_submit', 'txt_uname', 'txt_pwd') as $arg)
if(!isset($_POST[$arg]))
die("$arg field is not set or empty");
# Prevent SQL injection
$stmt = $con->prepare("SELECT COUNT(*) as cntUser FROM users WHERE Username ? AND passwrd = ?");
$stmt->bind_param("ss", $_POST['txt_uname'], $_POST['txt_pwd']);
if(!$stmt->execute()) mysqli_error($con);
$stmt->store_result();
# Check the row count is more than 0
if($stmt->num_rows != 0)
session_start(); # Start session, if config.php already does this you can remove this
$_SESSION['uname'] = $_POST['txt_uname']; # Think about injects here - use the database record not untrusted POST data
header('Location: ' . sprintf("%s://%s/welcome.php", isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http', $_SERVER['SERVER_NAME']));
exit();
# Nothing was returned
die('Incorrect username / password combination');
注意事项,您不应将用户名存储在会话中,这应该是 token,在您的情况下,用户名作为参数提供:
$_SESSION['token'] = \Firebase\JWT\JWT::encode(array('username' => $_POST['uname']), 'your secret');
然后在您的 Welcome.php 文件中,您可以像这样对其进行解码(建议构建某种事先执行此操作的控制器):
$user = \Firebase\JWT\JWT::decode($_SESSION['token'], 'your secret', array('HS256'));
echo $user['username'];
另外需要注意的是,最好将数据从数据库中取出,这样您就可以使用他们的唯一 ID 创建一个令牌以及您希望包含的其他身份(远离敏感信息)。
【讨论】:
mysqli_real_escape_string()
需要连接作为第一个参数。但是,我不明白你为什么建议$_SESSION['uname'] = mysqli_real_escape_string($_POST['txt_uname']);
,没有必要。
说得好,我把它放在那里的唯一原因是为了停止像 XSS 这样的会话注入,但如果做得好,他可以轻松查询数据库并使用数据库中已知的记录如果使用准备好的语句,则不包含任何注入,但现在将其编辑出来@FunkFortyNiner
我会将$stmt->execute();
更改为if(!$stmt->execute()) mysqli_error($con);
,以便它可能引发错误。
在适用的情况下随时更新和更改,我不是 Mysqli_* 专家,我使用 PDO,所以大部分内容来自手册,因为我回答了@FunkFortyNiner
好的。首先感谢您的回答。我知道我的提交按钮未设置或为空,我不知道如何解决这个问题...有什么建议吗?以上是关于php登录页面 - 当我插入有效数据时它不起作用,但是当我插入无效数据时它完美地工作[重复]的主要内容,如果未能解决你的问题,请参考以下文章
当我将变量中的值传递给 JSON 代码时它不起作用但是如果我硬编码它在 PHP 中的值