我的php页面设置了需要密码才能访问,并设置了半小时自动注销。
我还需要增加一个功能,就是密码输入3次错误,锁定账户5分钟。
请问如何写代码?谢谢
<?php
session_start();
if(isset($_POST['password']) && $_POST['password'] == '123456'){
$_SESSION['ok'] = 1;
header('location:?');
}
if(!isset($_SESSION['ok'])){
exit('
<form method="post">
password:<input type="password" name="password" />
<input type="submit" value="login" />
</form>
');
}
// cookie保存时间,分钟
$lifeTime = 1800;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");
?>
$_SESSION['num'] += 1; if($_SESSION['num'] >= 3){此处操作数据库 帐号状态改为锁定 并记录当前锁定时间。
if($_SESSION[$ip] < 3){
if(isset($_POST['password']) && $_POST['password'] == '123456'){
$_SESSION['ok'] = 1;
$_SESSION[$ip] = 0;//登录成功,IP登录次数归零
header('location:?');}
if(!isset($_SESSION['ok'])){
$_SESSION[$ip] = $_SESSION[$ip] + 1;//累积登录错误次数 exit('<form method="post">
password:<input type="password" name="password" /><input type="submit" value="login" />
</form');}
// cookie保存时间,分钟
$lifeTime = 1800;
setcookie(session_name(), session_id(), time() + $lifeTime, "/"); }
else
{echo '你已经输错3次密码,请等5分钟再试试';}
//获取用户真实IP
function getIp(){ $onlineip='';
if(getenv('HTTP_CLIENT_IP')&&strcasecmp(getenv('HTTP_CLIENT_IP'),'unknown')){
$onlineip=getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR')&&strcasecmp(getenv('HTTP_X_FORWARDED_FOR'),'unknown')){
$onlineip=getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR')&&strcasecmp(getenv('REMOTE_ADDR'),'unknown')){
$onlineip=getenv('REMOTE_ADDR'); elseif(isset($_SERVER['REMOTE_ADDR'])&&$_SERVER['REMOTE_ADDR']&&strcasecmp($_SERVER['REMOTE_ADDR'],'unknown')){ $onlineip=$_SERVER['REMOTE_ADDR']; } return $onlineip;
} ?>通过SESSION和cookie可以简单的就实现了。
if(isset($_POST['password']) && $_POST['password'] == '123456'){
$_SESSION['ok'] = 1;
header('location:?');
}else{
$_SESSION['num'] += 1;
if($_SESSION['num'] >= 3){
//此处操作数据库 帐号状态改为锁定 并记录当前锁定时间
}
}本回答被网友采纳
session_start();
ini_set('session.gc_maxlifetime', 300); //设置SESSION过期时间
$ip = getIp();
if($_SESSION[$ip] < 3){
if(isset($_POST['password']) && $_POST['password'] == '123456'){
$_SESSION['ok'] = 1;
$_SESSION[$ip] = 0;//登录成功,IP登录次数归零
header('location:?');
}
if(!isset($_SESSION['ok'])){
$_SESSION[$ip] = $_SESSION[$ip] + 1;//累积登录错误次数
exit('
<form method="post">
password:<input type="password" name="password" />
<input type="submit" value="login" />
</form>
');
}
// cookie保存时间,分钟
$lifeTime = 1800;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");
}
else
{echo '你已经输错3次密码,请等5分钟再试试';}
//获取用户真实IP
function getIp(){
$onlineip='';
if(getenv('HTTP_CLIENT_IP')&&strcasecmp(getenv('HTTP_CLIENT_IP'),'unknown')){
$onlineip=getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR')&&strcasecmp(getenv('HTTP_X_FORWARDED_FOR'),'unknown')){
$onlineip=getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR')&&strcasecmp(getenv('REMOTE_ADDR'),'unknown')){
$onlineip=getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR'])&&$_SERVER['REMOTE_ADDR']&&strcasecmp($_SERVER['REMOTE_ADDR'],'unknown')){
$onlineip=$_SERVER['REMOTE_ADDR'];
}
return $onlineip;
}
?>
通过SESSION和cookie可以简单的就实现了
谢谢。您这个代码有点问题,密码输入错误3次之后出现了惊人的一幕,
页面显示“你已经输错3次密码,请等5分钟再试试”,然后居然就把网页内容暴露出来了。
师傅您能再修正一下吗?
//改为
exit( '你已经输错3次密码,请等5分钟再试试');追问
成功了。但是页面出现好多无关的数字,希望能去除这些无关数字。
还有,虽然密码输入错误3次禁止登陆5分钟,但是清除一下cookie,又能继续登陆了。
能改成 同一IP用户输入密码错误3次禁止登陆5分钟? 要如何写?谢谢。
这个限制方法的确是有BUG,最好的是将登录错误的次数写进数据库,或者写入本地的缓存文件,其实原理都一样。
至于你这些数字,我这边没有出现,所以不知道你的什么原因
那麻烦师傅再修改为 同一IP用户输入密码错误3次禁止登陆5分钟 ,行不?谢谢。我一定采纳您。还提高奖赏。
追答先建个检测的表,字段分别为 “IP地址”,“登录错误次数”,“被锁定的时间”。
然后呢,通过来访的IP获取登录错误的次数和被锁定的时间,3次以上的就提示
没有超过的就检验,如果密码错误,那就更新数据库的数据
代码帖不出来了,超过限制了,私信给你追问想要私信给你,总是提示验证码错误,无法私信你。
你好。我另外开了个问题,可以看到我的账号,请您私信给我。
请看
你可以设置一个数据库字段,用于叠加失败次数,失败一次加一。如果叠加到三次,那么便设置用户为不可用状态(比如用户状态 0 禁止 1 可用 2 失败禁止)。然后设置一个禁用的时间(什么时候禁用结束),在用户登录的方法里可以先验证用户是否失败禁止登录,然后再判断失效时间,过了才做登录判断。如果用户登录成功则将该字段还原失败次数为0。