Php 登录问题我可以使用任何用户名和密码登录

Php 登录问题我可以使用任何用户名和密码登录,php,mysql,pdo,Php,Mysql,Pdo,我的登录系统有问题我可以使用任何用户名和密码登录我不知道如何修复 如果有人能帮忙,我将非常感激 这里是我的登录系统 function userLog() { global $connect; if(isset($_POST['userLog'])) { $username = trim(protect($_POST['username'])); $password = trim(protect($_POST['password']));

我的登录系统有问题我可以使用任何用户名和密码登录我不知道如何修复

如果有人能帮忙,我将非常感激

这里是我的登录系统

function userLog() {
    global $connect;
    if(isset($_POST['userLog'])) {
        $username = trim(protect($_POST['username']));
        $password = trim(protect($_POST['password']));

        if(empty($username)) {
            $_SESSION['message'] = '';
            header('Location: index.php');
            exit();
        } elseif (empty($password)) {
            $_SESSION['message'] = '';
            header('Location: index.php');
            exit();     
        }
        $userSQL = "SELECT * FROM users WHERE username = :username";
        $userLog = $connect->prepare($userSQL);
        $userLog->bindValue(':username', $username);
        $userLog->execute();
        $userLog->fetchAll();

        #PLACE FOR SELECT DATA FROM SQL TO IMPORT TO SESSION
        $sql = "SELECT * FROM users";
        $stm = $connect->prepare($sql);
        $stm->execute();
        $row = $stm->fetch();
        ####################################################

        if($userLog) {
            $_SESSION['user_id']  = $row['user_id'];#id(mysql)
            $_SESSION['username'] = $row['username'];#user(mysql)
            $_SESSION['email']    = $row['email'];#email(mysql)
            $_SESSION['f_name']   = $row['first_name'];#fname(mysql)
            $_SESSION['l_name']   = $row['last_name'];#lname(mysql)

            header('Location: index.php');
            exit();
        } else {

        }
    }
}

抱歉,英语不好

这里您没有检查任何密码,因此当然任何人都可以登录,您应该这样修复它:

$userSQL = "SELECT * FROM users WHERE username = :usr AND password = :pwd";
$userLog = $connect->prepare($userSQL);
$userLog->bindValue(':usr', $username);
$userLog->bindValue(':pwd', $password);
$userLog->execute();
$users = $userLog->fetchAll();

if(count($users) == 0) {
  // fail here, no one to login
  exit();
} elseif(count($users) > 1) {
  // Found more than one user, this should not happen, maybe fail.
}

如果此检查通过,则用户已登录,而且
$users[0]
保存您的用户信息

我无法深入创建类!你需要检查课程

我刚刚尽可能地修改了您的代码,我使用了bindParam而不是bindValue

我希望你正在使用pdo,它表明你是:)请把
session_start()位于页面顶部,然后再进行其他操作

function userLog() {
    global $connect;
    if(isset($_POST['userLog'])) {
        $username = trim($_POST['username']);
        $password = trim($_POST['password']);

        if(empty($username)) {
            $_SESSION['message'] = 'Enter username';
            header('Location: index.php');
            exit();
        } elseif (empty($password)) {
            $_SESSION['message'] = 'Enter password';
            header('Location: index.php');
            exit();     
        }else{
            $sql = "SELECT * FROM users WHERE username = :username";
            if($stmt = $connect->prepare($sql)){
                $stmt->bindParam(':username', $param_username, PDO::PARAM_STR);
                $param_username = $username;
                if($stmt->execute()){
                    $row = $stmt->fetch();
                    if($row['username'] === 1){
                        $hashed_password = $row['password'];
                        $email = $row['email'];
                        $name = $row['f_name'];
                        $lastname = $row['l_name'];
                        $id = intval($row['user_id']);
                        if(password_verify($password, $hashed_password)){
                            session_regenerate_id();
                            $_SESSION["loggedin"] = true;
                            $_SESSION['user_id'] = $id; 
                            $_SESSION['username'] = $username; 
                            $_SESSION['email'] = $email; 
                            $_SESSION['f_name'] = $name; 
                            $_SESSION['l_name'] = $lastname;    

                            header('Location: index.php');
                            exit();                             
                        }else{
                            $_SESSION['message'] = 'wrong password';
                        }
                    }else{
                        $_SESSION['message'] = 'wrong username';
                    }
                }else{
                    $_SESSION['message'] = 'User not found';
                }
            }else{
                $_SESSION['message'] = 'Something went wrong';
            }
        }
    }
}
我让你重定向到你的错误页面

更新:这是一个简单的类示例,搜索创建类的正确方法

class userLog {
/** @var object $connect Copy of PDO connection */
private $connect;
/** @var object of the logged in user */
private $user;
/** @var string error msg */
private $msg;

    public function __construct($connect) {
        $this->connect = $connect;
    }  

    public function login($username,$password){
        $stmt = $this->connect->prepare('SELECT * FROM users WHERE username = ? ');
        $stmt->execute([$username]);
        $user = $stmt->fetch();
        if(password_verify($password,$user['password'])){
                $this->user = $user;
                session_regenerate_id();
                $_SESSION['user']['user_id'] = $user['user_id'];
                $_SESSION['user']['fname'] = $user['fname'];
                $_SESSION['user']['lname'] = $user['lname'];
                $_SESSION['user']['email'] = $user['email'];
                return true;
        }else{
            $this->msg = 'Invalid login information';
            //you can change ajax response to session error
            return false;
        } 
    }
}
Usaqe:
$handle=newuserlog($connect)


注意:此函数要求ajax返回响应。

使用
用户名选择用户
,然后对照“行密码”列检查密码。您不需要获取所有用户并与所选的1行进行比较。你是什么时候开始的?这种想法是行不通的。
fetchAll()
不会把它所获取的东西(如果有的话)放在任何地方。您只需将其转换为以太:)在web或PHP手册中必须有1000个登录脚本示例。我建议你找一些,再试试储存纯文本密码!请使用PHP来处理密码安全性。如果您使用的PHP版本低于5.5,则可以使用
密码\u hash()
。在散列之前,不需要对它们执行任何操作或使用任何其他清理机制。这样做会更改密码,并导致不必要的额外编码。如果您没有时间在第一次正确使用密码,您将在何时找到时间在以后添加密码?我讨厌人们说“我没走那么远…”或“这个网站不会公开…”或“它只供学校使用,所以安全不重要…”。如果老师和教授从一开始就不谈论安全问题,那他们就是做错了。挑战他们。他们正在教授草率而危险的编码实践,学生们以后将不得不放弃这些实践。我也讨厌人们说“我以后再添加安全性…”或“安全性现在不重要…”或“忽略安全风险…”的时候。除了仍然要求密码是纯文本。。。如果不是主键,则应将
用户名
作为数据库中的
唯一
索引;然后选择该用户,然后使用
password\u verify()
验证密码。当然,这需要首先使用
password\u hash()
创建密码。。。应该是这样的。首先,你不能选择用户名/密码。要改进这个登录系统,需要做很多事情。但就目前的状态和水平而言,我认为这是一个直截了当的解决方案。我通常存储密码散列,然后在用户插入的密码散列的情况下对username/userid和password\u散列执行选择,因此我永远不会从数据库中提取正确的密码散列。因为这样做没有意义,除非你想区分“错误的用户名”和“错误的密码”错误(这是一件非常糟糕的事情)。我们甚至可以争论,通过从数据库中提取用户来检查php环境中的哈希值,我的做法并不是让你的系统遭受定时攻击的最佳做法,您的脚本将仅在用户存在时执行哈希检查,因此攻击者可以通过计时您的响应时间来了解您的系统上是否存在用户名。如果您使用的是
密码\u hash()
密码\u verify()
在从数据库检索到哈希密码之前,您不知道salt是什么-因此您无法在SQL查询中选择它。。。或者我遗漏了什么?不,这是真的,第二条评论在您的系统使用全局salt的环境中是可行的。在我看来,对每个密码使用随机salt并使用密码将其存储到数据库中根本不会提高系统安全性(这里我准备讨论一下;))谢谢您的解释非常有用希望它有帮助!您可以询问是否需要更多信息,使用
$hashed\u password=password\u hash($password,password\u DEFAULT)注册时哈希密码。我现在正在使用密码哈希。我有个问题,如果(empty($username)){}elseif(empty($password))}else{}或者像这样的代码如果(something){}如果(something){}你正确使用了它,那么使用这样的代码是很重要的!看看我在回答的第一个代码中是如何使用的,我在手机上,所以不能写代码<代码>如果(空($username)){$_会话['message']='Enter username';header('Location:index.php');exit();}elseif(空($password)){$_会话['message']='Enter password';header('Location:index.php');exit();}否则{}
好的,谢谢。。。由于字母数最少,所以有三个点