30分钟登录错误次数超次数限制(纯原生php)

转自www.3maio.com/w-detail/10

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 blog_admin where email = ?";

$stmt = $this->pdo->prepare($sql);

$stmt->execute([$email]);

$userData = $stmt->fetch(\PDO::FETCH_ASSOC);

//没有对应邮箱

if ( empty($userData) ) {

echo '登录失败1';

echo '';

exit;

}

//检查用户最近30分钟密码错误次数

$res = $this->checkPassWrongTime($userData['id']);

//错误次数超过限制次数

if ( $res === false ) {

echo '你刚刚输错很多次密码,为了保证账户安全,系统已经将您账号锁定30min';

echo '';

exit;

}

//判断密码是否正确

$isRightPass = password_verify($pass, $userData['pass']);

//登录成功

if ( $isRightPass ) {

echo '登录成功';

exit;

} else {

//记录密码错误次数

$this->recordPassWrongTime($userData['id']);

echo '登录失败2';

echo '';

exit;

}

}

//记录密码输出信息

protected function recordPassWrongTime($uid)

{

//ip2long()函数可以将IP地址转换成数字

$ip = ip2long( $_SERVER['REMOTE_ADDR'] );

$time = date('Y-m-d H:i:s');

$sql = "insert into blog_admin_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 = @$_GET['a']?$_GET['a']:'loginPage';

$login = new Login();

$login->$a();

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Php:脚本语言,网站建设,服务器端运行 PHP定义:一种服务器端的HTML脚本/编程语言,是一种简单的、面向对象...
    廖马儿阅读 6,709评论 2 38
  • PHP-人员权限管理(RBAC) 权限管理可以想做vip的功能,普通用户和vip用户的功能是不一样的,大致会用到五...
    eda4468f4688阅读 3,878评论 0 3
  • PHP-人员权限管理(RBAC) 权限管理可以想做vip的功能,普通用户和vip用户的功能是不一样的,大致会用到五...
    司马东阳阅读 4,212评论 0 1
  • Web安全简史 在Web1.0时代,人们更多是关注服务器端动态脚本语言的安全问题,比如将一个可执行脚本(俗称Web...
    潘良虎阅读 9,349评论 3 72
  • 关于Linux系统安全加固的具体实现脚本及基线检查规范,以供主机维护人员参考学习。 其中以下脚本主要实现的功能包括...
    大福技术阅读 11,583评论 1 3

友情链接更多精彩内容