Rumah pembangunan bahagian belakang masalah PHP php登录失败怎么处理

php登录失败怎么处理

Mar 19, 2021 am 09:14 AM
php

php登录失败的处理方法:首先创建一个表负责记录用户登录的信息;然后从user_login_info表查询最近30分钟内有没有相关密码错误的记录;接着统计记录总条数是否达到设定的错误次数;最后设置登录密码错误次数限制即可。

php登录失败怎么处理

本文操作环境:windows7系统、PHP7.1版,DELL G3电脑

PHP实现登录失败次数限制

登录密码错误次数限制

安全对每个网站的重要性,不言自明。 其中,登陆又是网站中比较容易受到攻击的一个地方,那么我们如何对登陆功能的安全性加强呢?

我们先来看一些知名的网站是如何做的

Github

Github网站同一个账号在同一个IP地址连续密码输错一定次数后,这个账号是会被锁定30分钟的。

Github这么做的主要原因,我觉得主要基于以下考虑:

防止用户的账号密码被暴力破解

实现思路

既然这么多网站的登陆功能都这么个功能,那么具体如何实现的。下面,就具体说说。

思路

需要一个表(user_login_info)负责记录用户登录的信息,不管登录成功还是失败都记录。并且登陆失败还是成功需要能够区分开来。

每次登陆时,都先从user_login_info表查询最近30分钟内(这里假设密码错误次数达到5次后,禁用用户30分钟)有没有相关密码错误的记录,然后统计一下记录总条数是否达到设定的错误次数。

如果在相同IP下,同一个用户,在30分钟内密码错误次数达到设定的错误次数,就不让用户登录了。

【推荐:PHP视频教程

具体代码与及表设计

表设计

user_login_info表

   CREATE TABLE `user_login_info` (
       `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT  NOT NULL,
       `uid` int(10) UNSIGNED NOT NULL,
       `ipaddr` int(10) UNSIGNED NOT NULL COMMENT '用户登陆IP',
       `logintime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
       COMMENT '用户登陆时间',
       `pass_wrong_time_status` tinyint(10) UNSIGNED NOT NULL COMMENT '登陆密码错误状态' 
       COMMENT '0 正确 2错误'
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
user表(用户表)
   CREATE TABLE `user` (
      `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
      `name` varchar(100) NOT NULL COMMENT '用户名',
      `email` varchar(100) NOT NULL,
      `pass` varchar(255) NOT NULL,
      `status` tinyint(3) UNSIGNED NOT NULL DEFAULT '1' COMMENT '1启用 2禁用',
       PRIMARY key(id)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
核心代码
<?php
 
class Login
{
 
    protected $pdo;
 
    public function __construct()
    {
        //链接数据库
        $this->connectDB();
    }
 
    protected function connectDB()
    {
        $dsn = "mysql:host=localhost;dbname=demo;charset=utf8";
        $this->pdo = new PDO($dsn, &#39;root&#39;, &#39;root&#39;);
    }
 
    //显示登录页
    public function loginPage()
    {
          include_once(&#39;./html/login.html&#39;);
 
    }
 
    //接受用户数据做登录
    public function handlerLogin()
    {
 
        $email = $_POST[&#39;email&#39;];
        $pass = $_POST[&#39;pass&#39;];
 
        //根据用户提交数据查询用户信息
        $sql = "select id,name,pass,reg_time from user where email = ?";
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute([$email]);
 
        $userData = $stmt->fetch(\PDO::FETCH_ASSOC);
 
        //没有对应邮箱
        if ( empty($userData) ) {
 
            echo &#39;登录失败1&#39;;
 
            echo &#39;<meta http-equiv="refresh" content="2;url=./login.php">&#39;;
            exit;
        }
 
        //检查用户最近30分钟密码错误次数
        $res = $this->checkPassWrongTime($userData[&#39;id&#39;]);
 
        //错误次数超过限制次数
        if ( $res === false ) {
            echo &#39;你刚刚输错很多次密码,为了保证账户安全,系统已经将您账号锁定30min&#39;;
 
            echo &#39;<meta http-equiv="refresh" content="2;url=./login.php">&#39;;
            exit;
        }
 
 
        //判断密码是否正确
        $isRightPass = password_verify($pass, $userData[&#39;pass&#39;]);
 
        //登录成功
        if ( $isRightPass ) {
 
            echo &#39;登录成功&#39;;
            exit;
        } else {
 
            //记录密码错误次数
            $this->recordPassWrongTime($userData[&#39;id&#39;]);
 
            echo &#39;登录失败2&#39;;
            echo &#39;<meta http-equiv="refresh" content="2;url=./login.php">&#39;;
            exit;
        }
 
    }
 
    //记录密码输出信息
    protected function recordPassWrongTime($uid)
    {
 
        //ip2long()函数可以将IP地址转换成数字
        $ip = ip2long( $_SERVER[&#39;REMOTE_ADDR&#39;] );
 
        $time = date(&#39;Y-m-d H:i:s&#39;);
        $sql = "insert into user_login_info(uid,ipaddr,logintime,pass_wrong_time_status) values($uid,$ip,&#39;{$time}&#39;,2)";
 
 
        $stmt = $this->pdo->prepare($sql);
 
        $stmt->execute();
    }
 
    /**
     * 检查用户最近$min分钟密码错误次数
     * $uid 用户ID
     * $min  锁定时间
     * $wTIme 错误次数
     * @return 错误次数超过返回false,其他返回错误次数,提示用户
     */
    protected function checkPassWrongTime($uid, $min=30, $wTime=3)
    {
 
        if ( empty($uid) ) {
 
            throw new \Exception("第一个参数不能为空");
 
        }
 
        $time = time();
        $prevTime = time() - $min*60;
 
        //用户所在登录ip
        $ip = ip2long( $_SERVER[&#39;REMOTE_ADDR&#39;] );
 
 
        //pass_wrong_time_status代表用户输出了密码
        $sql = "select * from user_login_info where uid={$uid} and pass_wrong_time_status=2 and UNIX_TIMESTAMP(logintime) between $prevTime and $time and ipaddr=$ip";
 
        $stmt = $this->pdo->prepare($sql);
 
        $stmt->execute();
 
        $data = $stmt->fetchAll(\PDO::FETCH_ASSOC);
 
 
        //统计错误次数
        $wrongTime = count($data);
 
        //判断错误次数是否超过限制次数
        if ( $wrongTime > $wTime ) {
            return false;
        }
 
        return $wrongTime;
 
    }
 
    public function __call($methodName, $params)
    {
 
        echo &#39;访问的页面不存在&#39;,&#39;<a href="./login.php">返回登录页</a>&#39;;
    }
}
 
$a = @$_GET[&#39;a&#39;]?$_GET[&#39;a&#39;]:&#39;loginPage&#39;;
 
 
$login = new Login();
 
$login->$a();
Salin selepas log masuk

Atas ialah kandungan terperinci php登录失败怎么处理. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

CakePHP Bekerja dengan Pangkalan Data CakePHP Bekerja dengan Pangkalan Data Sep 10, 2024 pm 05:25 PM

Bekerja dengan pangkalan data dalam CakePHP adalah sangat mudah. Kami akan memahami operasi CRUD (Buat, Baca, Kemas Kini, Padam) dalam bab ini.

Tarikh dan Masa CakePHP Tarikh dan Masa CakePHP Sep 10, 2024 pm 05:27 PM

Untuk bekerja dengan tarikh dan masa dalam cakephp4, kami akan menggunakan kelas FrozenTime yang tersedia.

Muat naik Fail CakePHP Muat naik Fail CakePHP Sep 10, 2024 pm 05:27 PM

Untuk mengusahakan muat naik fail, kami akan menggunakan pembantu borang. Di sini, adalah contoh untuk muat naik fail.

Bincangkan CakePHP Bincangkan CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ialah rangka kerja sumber terbuka untuk PHP. Ia bertujuan untuk menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP adalah berdasarkan seni bina seperti MVC yang berkuasa dan mudah difahami. Model, Pandangan dan Pengawal gu

Pengesah Mencipta CakePHP Pengesah Mencipta CakePHP Sep 10, 2024 pm 05:26 PM

Pengesah boleh dibuat dengan menambah dua baris berikut dalam pengawal.

Pembalakan CakePHP Pembalakan CakePHP Sep 10, 2024 pm 05:26 PM

Log masuk CakePHP adalah tugas yang sangat mudah. Anda hanya perlu menggunakan satu fungsi. Anda boleh log ralat, pengecualian, aktiviti pengguna, tindakan yang diambil oleh pengguna, untuk sebarang proses latar belakang seperti cronjob. Mengelog data dalam CakePHP adalah mudah. Fungsi log() disediakan

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

See all articles