为了防止后台被爆破, 需要限制用户登录错误次数
Thinkphp判断管理员用户登陆错误次数, 将次数和IP写入到缓存文件, 设置缓存有效期
当次数大于设定次数, 在缓存有效期内锁定用户登录
以下是实现代码, 如果thinkphp版本大于3.2, S()方法改为cache()方法即可
//判断用户登陆错误次数
private function check_user_login(){
//获取用户的ip作为标识。
$ip = 'login_'.$_SERVER['REMOTE_ADDR'];
$err = S($ip);
if(empty($err) ){
$err = 1;
//S() 缓存写入,300秒
S($ip,$err,300);
}elseif(!empty($err) && $err < 3){
$err++;
S($ip,$err,300);
}elseif($err >= 3){
S($ip,$err,300);
}
//返回错误次数
return $err;
}
// 登录检测
public function checkLogin() {
//限制用户登录次数
$ip = 'login_'.$_SERVER['REMOTE_ADDR'];
$err = S($ip);
if(!empty($err) && $err >= 3){
$msg = '您已经错误了'.$err.'次,请5分钟后再试';
$this->error($msg);
die;
}
$map = array();
$map['account'] = $_POST['account'];
$map['usertype'] = intval($_POST['usertype']);
$map["status"] = array('gt',0);
if($_SESSION['verify'] != md5($_POST['verify'])) {
$this->error('验证码错误!');
}
import ( '@.ORG.Util.RBAC' );
$authInfo = RBAC::authenticate($map);
if(!empty($authInfo)) {
if($authInfo['password'] != md5($_POST['password'])) {
$err = $this->check_user_login();
if($err < 3){
$msg = '您已经错误了'.$err.'次,还剩'. (3 - $err) .'次机会!';
}elseif($err >= 3){
$msg = '您已经错误了'.$err.'次,请5分钟后再试';
}
$this->error('密码错误!'.$msg);
die;
}else{
//保存session 等登录信息
//清除登录错误次数
S($ip,null);
$this->success('登录成功!',$gourl);
}
}
}



还没有评论,来说两句吧...