PHP实现登录失败次数限制

php限制同一用户登录次数 php限制同一用户登录次数,非常使用,简单。 立即下载

登录密码错误次数限制

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

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

  • Github

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

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

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

    实现思路

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

    • 思路

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

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

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

    具体代码与及表设计

    • 表设计

    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, 'root', 'root');
        }
    
        //显示登录页
        public function loginPage()
        {
              include_once('./html/login.html');
    
        }
    
        //接受用户数据做登录
        public function handlerLogin()
        {
    
            $email = $_POST['email'];
            $pass = $_POST['pass'];
    
            //根据用户提交数据查询用户信息
            $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 '登录失败1';
    
                echo '<meta http-equiv="refresh" content="2;url=./login.php">';
                exit;
            }
    
            //检查用户最近30分钟密码错误次数
            $res = $this->checkPassWrongTime($userData['id']);
    
            //错误次数超过限制次数
            if ( $res === false ) {
                echo '你刚刚输错很多次密码,为了保证账户安全,系统已经将您账号锁定30min';
    
                echo '<meta http-equiv="refresh" content="2;url=./login.php">';
                exit;
            }
    
    
            //判断密码是否正确
            $isRightPass = password_verify($pass, $userData['pass']);
    
            //登录成功
            if ( $isRightPass ) {
    
                echo '登录成功';
                exit;
            } else {
    
                //记录密码错误次数
                $this->recordPassWrongTime($userData['id']);
    
                echo '登录失败2';
                echo '<meta http-equiv="refresh" content="2;url=./login.php">';
                exit;
            }
    
        }
    
        //记录密码输出信息
        protected function recordPassWrongTime($uid)
        {
    
            //ip2long()函数可以将IP地址转换成数字
            $ip = ip2long( $_SERVER['REMOTE_ADDR'] );
    
            $time = date('Y-m-d H:i:s');
            $sql = "insert into user_login_info(uid,ipaddr,logintime,pass_wrong_time_status) values($uid,$ip,'{$time}',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['REMOTE_ADDR'] );
    
    
            //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 '访问的页面不存在','<a href="./login.php">返回登录页</a>';
        }
    }
    
    $a = @$_GET['a']?$_GET['a']:'loginPage';
    
    
    $login = new Login();
    
    $login->$a();


告别DLTS的模糊地带:手把手教你用拉普拉斯深能级瞬态光谱(LDLTS)精准揪出半导体缺陷 本文详细介绍了拉普拉斯深能级瞬态光谱(LDLTS)技术在半导体缺陷检测中的高分辨率解决方案。相比传统DLTS,LDLTS通过拉普拉斯变换和正则化算法,将分辨率提升至1meV,有效解析复杂重叠缺陷谱,适用于硅、GaN等材料的精确缺陷分析。文章涵盖LDLTS原理、系统搭建、测量流程及工业应用案例,为半导体工艺优化提供强大工具。 阅读详情

相关推荐

EPLAN二次开发实战:从API接口到定制化功能的完整指南

本文为电气工程师和自动化设计师提供了一份EPLAN二次开发的完整实战指南。文章详细介绍了从脚本、插件到独立程序三种开发模式,重点讲解了如何使用C#或VB.NET通过API接口操作EPLAN数据模型,实现定制化功能以提升设计效率,并分享了开发环境搭建、调试及项目打包分发的避坑经验。

c6d7e8f9g的博客 1117

登录失败次数限制(原生php代码实现)

登录密码错误次数限制 安全对每个网站的重要性,不言自明。 其中,登陆又是网站中比较容易受到攻击的一个地方,那么我们如何对登陆功能的安全性加强呢? 我们先来看一些知名的网站是如何做的Github Github网站同一个账号在同一个IP地址连续密码输错一定次数后,这个账号是会被锁定30分钟的。如下图所示:Github这么做的主要原因,我觉得主要基于以下考虑:防止用户的账号密码被暴力破解 Si

小罗的博客 9936

基于 YOLO + SAM 的自动图像标注实战

摘要: 本文提出一种基于YOLO检测和SAM分割的自动化数据标注流水线方案,通过YOLO定位目标并生成检测框,再以检测框为提示驱动SAM完成精细分割,最终输出YOLO格式的标注文件。该方案将人工标注升级为半自动流程,显著提升标注效率,尤其适用于多类别、大规模图像的实例级标注需求。代码模块化设计支持模型灵活替换,并集成异常处理与进度可视化功能。虽依赖YOLO检测质量且对小目标存在局限,但作为工程落地方案,可有效降低私有数据集构建成本,适用于工业检测、遥感等场景的冷启动标注。

qq_64366203的博客 1144

PHP实现登录失败后账号锁定功能

用户登录失败后,需要记录登录失败日志并进行缓存。在缓存中,存放了登录失败的时间信息,思路是以天为单位进行存储。具体的时间间隔可以根据实际需求进行调整。 在登录过程中,需要先判断用户输入的登录账号是否正确。然后,再对当天登录失败的次数进行判断。如果超过设定的阈值,则直接返回账号被锁定的消息。

胡思乱想的程序员 775

ubuntu安装XXX包时出现(= 20.0.8-0ubuntu1~18.04.1) but it is not going to be installed

安装mujoco_py时,最后一步尝试 import mujoco_py 时出现报错 esashim.c:1:10: fatal error: GL/osmesa.h: No such file or directory 1 | #include <GL/osmesa.h> | ^~~~~~~~~~~~~ compilation terminated. 在https://github.com/openai/mujoco-py#ubuntu-ins

dealexce的博客 1793

别再手动写JSON了!用Node-RED OPC UA节点5分钟搞定楼宇温湿度数据采集

本文介绍了如何利用Node-RED和OPC UA节点快速实现楼宇温湿度数据的自动化采集与JSON格式转换。通过可视化工具Node-RED,开发者无需编写复杂代码,5分钟内即可完成从传感器到数据输出的全流程配置,大幅提升智慧楼宇和工业物联网项目的实施效率。

weixin_30368405的博客 431

mysql 用户输错密码锁定_用户密码输错N次,自动锁定

用户密码输错N次,自动锁定龙行PHP2020-8-64870评论好久没更新了,来一篇,一个小功能看看需求:除去验证码登录,一般的账号密码登录的时候往往会设置各种限制,现在来捋捋这个账号冻结小功能。功能逻辑:1)给用户表增加两个字段:err_time(登录账号密码输错的时间),err_count(账号密码输错次数)。在这里波波说的一点就是也有朋友建议用缓存的方式,但是...

weixin_31119637的博客 2459

用Python可视化硅晶体生长:3D图解<100>/<110>/<111>晶向差异

本文通过Python 3D可视化技术,详细解析了硅晶体生长中<100>、<110>、<111>三种关键晶向的差异及其在半导体工业中的应用。从密勒指数转换到原子密度计算,结合交互式3D模型展示不同晶向的原子排列特性,帮助读者深入理解晶向对芯片性能的影响。

weixin_42567752的博客 567

php登录错误3次锁定,模拟用户登录,密码错误3次锁定

程序要求:输入用户名进行用户名认证,如果用户名在黑名单则提示用户已经被锁定,如果输入用户名没在黑名单则进行密码认证,认证成功后显示欢迎信息,如果输入错误三次后锁定用户。解决方案:1、明确可成功登录的用户名和密码;2、用户黑名单,三次登录失败后,将用户名写入黑名单;3、检测黑名单的内容,如果与当前登录名一致,则不允许继续输入密码,直接提示用户已锁定。#!/usr/bin/env python# -*...

weixin_39673601的博客 1206

从0到1做AI漫剧:即梦+豆包+剪映+红果全流程实战

AI视频生成正在重塑内容创作的生产方式,它让原本高门槛的影视制作,变成了一条由文本、画面、剪辑与分发环节协同的流水线。理解其底层原理,在于将大模型的语义理解、图像生成与视频合成能力,与工程化的流程管理相结合,从而实现从创意到成片的自动化输出。这种技术的价值,不仅体现在降低制作成本,更在于让个人创作者能够独立完成高质量短剧,并快速迭代内容。在短剧、短视频、广告营销等场景中,利用即梦生成画面、豆包编写剧本、剪映完成剪辑、红果进行分发的组合,已成为一种被广泛验证的实践路径。本文聚焦AI漫剧制作,从环境准备、分镜设

weixin_34072637的博客 380

3、利用预训练卷积神经网络进行特征提取

本文介绍了如何使用预训练的卷积神经网络(如VGG16)进行图像特征提取,并将提取的特征存储在HDF5数据集中,以便后续用于机器学习模型的训练。文章详细阐述了特征提取的原理、HDF5数据格式的优势、HDF5DatasetWriter类的实现、特征提取流程的代码实现以及实际应用案例。通过该方法,可以在多种图像数据集上高效构建高精度的分类模型。

z2a3b4c5d的博客 112

php实现登录失败次数限制

需求:同一个账号在同一个IP地址连续密码输错一定次数后,这个账号是会被锁定30分钟的。 实现思路: 需要一个表(user_login_info)负责记录用户登录的信息,不管登录成功还是失败都记录。并且登陆失败还是成功需要能够区分开来。 每次登陆时,都先从user_login_info表查询最近30分钟内(这里假设密码错误次数达到5次后,禁用用户30分钟)有没有相关密码错误的记录...

aomiano55778的博客 667

ruoyi-nbcio基于ruoyi的flowable前端支持自定义表单组件的自动获取方法

ruoyi-nbcio基于ruoyi的flowable前端支持自定义表单组件的自动获取方法

宁波阿成的博客 607

php记录用户登录失败次数,php实现登录失败次数限制

需求:同一个账号在同一个IP地址连续密码输错一定次数后,这个账号是会被锁定30分钟的。实现思路:需要一个表(user_login_info)负责记录用户登录的信息,不管登录成功还是失败都记录。并且登陆失败还是成功需要能够区分开来。每次登陆时,都先从user_login_info表查询最近30分钟内(这里假设密码错误次数达到5次后,禁用用户30分钟)有没有相关密码错误的记录,然后统计一下记录总条数是...

weixin_30109877的博客 657

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

php手机登录次数限制_php实现登录失败次数限制

需求:同一个账号在同一个IP地址连续密码输错一定次数后,这个账号是会被锁定30分钟的。实现思路:需要一个表(user_login_info)负责记录用户登录的信息,不管登录成功还是失败都记录。并且登陆失败还是成功需要能够区分开来。每次登陆时,都先从user_login_info表查询最近30分钟内(这里假设密码错误次数达到5次后,禁用用户30分钟)有没有相关密码错误的记录,然后统计一下记录总条数是...

weixin_36480576的博客 274

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

php多次登录失败,Laravel登录失败次数限制的实现方法

在用户身份验证的情况下,Laravel 具有内置的身份验证系统。我们可以根据要求轻松修改它。身份验证中包含的功能之一是Throttling.为什么我们需要throttling保护?基本上,throttling是用来保护暴力攻击的。它将在一定时间内检查登录尝试。在短登录中,throttling会计算用户或机器人尝试失败的登录尝试次数。使用自定义登录实现限制默认情况下,在内置身份验证控制器中实现限制。...

weixin_30980893的博客 698

php限制登陆尝试次数,Laravel登录失败次数限制的实现方法

在用户身份验证的情况下,laravel 具有内置的身份验证系统。我们可以根据要求轻松修改它。身份验证中包含的功能之一是throttling.为什么我们需要throttling保护?基本上,throttling是用来保护暴力攻击的。它将在一定时间内检查登录尝试。在短登录中,throttling会计算用户或机器人尝试失败的登录尝试次数。使用自定义登录实现限制默认情况下,在内置身份验证控制器中实现限制。...

weixin_42174176的博客 494

PHP实现过限制IP访问及提交次数的功能

一、原理 提交次数是肯定要往数据库里写次数这个数据的,比如用户登陆,当用户出错时就忘数据库写入出错次数1,并且出错时间,再出错写2,当满比如5次时提示不允许再登陆,请明天再试,然后用DateDiff计算出错时和now()的时间,如果大于24就再开放让他试。 封IP的话特别是给IP断就比较简单了, 先说给IP段开放的情况:先取出客户访问的IP,为了解释方便,设有IP192.168.6.2 现要开放I...

qq_26282869的博客 2694

php写账户冻结_php实例:用户登录名与密码多次错误则冻结账号

php实现登录次数超过5次,就冻结用户。冻结用户的标志列为:blocked=1。代码:复制代码 代码示例:/*** 多次登录失败,冻结账号* by www.jbxue.com*/if (!isset($_SESSION['AttemptsCounter'])){$_SESSION['AttemptsCounter'] = 0;}if (!isset($AllowAnyone)){ /* only ...

weixin_39593593的博客 541

08nosql redis 第一天

在线地址:https://docs.qq.com/doc/DQWlqWFVGZFd6eWdN <?php //创建一个对象 $redis = new Redis(); $redis->connect('localhost');//连接redis服务器 //如果redis服务器设置了密码,则使用如下代码验证 $redis->auth('123456'); //字符串类型操作...

fly 285

PHP数据流应用的一个简单例子

1 <?php 2 $count = 5; 3 start: 4 if($count < 5) echo "You can try {$count} time, "; 5 echo "Put Password: "; 6 $handle = fopen ("php://stdin","r"); 7 $line = fgets($handle); ...

baizhenqu2450的博客 149

DVWA比较暴力破解

Brute ForceImpossible Brute Force Source&lt;?php if( isset( $_POST[ 'Login' ] ) ) {     // Check Anti-CSRF token     checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );...

qq_40268306的博客 642

php手机登录次数限制_php – 限制失败的登录尝试次数

您不想将数据库用于“登录失败次数” – 检查?然后只需使用cookie并检查它.当然,他们可以删除它,但这是一个麻烦.但是,我怀疑你已经从数据库中获取了用户名和密码,为什么不在你访问时获取最后一次失败的登录?if (isset($_POST['submit_login'])) {if (isset($_POST['username']) && isset($_POST['passw...

weixin_32792909的博客 282

php 结合redis 限制用户登入 密码错误次数

就用原生的面向过程写了个小dome ,数据库信息用数组代替了. 整体思路是这样的,具体怎么用,具体的自己放框架里改改优化一下就 ok的。 php代码:<?php /** * Created by PhpStorm. * User: rjj * Date: 2017/7/2 * Time: 20:58 */ //实例化redis数据库 $redis= new Redis(); $re

ZUOKA 2023
上一篇: PHP的前世今生
下一篇: 理解RESTful架构
Watkin Lee
博客等级 码龄10年 18粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值