Ajax-防止页面恶意刷新
之前我的做法是,一次URL请求之后,记录当前时间,但它进行第二次请求时,把此时的时间和第一次时间作比对,如果时间间隔小于我设定的间隔,就不许他继续操作。
但这种做法有一个问题: 我触发一个请求,可能这个请求是一个ajax,所以我会同时触发2个请求,这样的时间间隔肯定小于我设定的间隔,这样第二个ajax请求可能不会被执行。
求改进方法。。。。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
防止恶意刷页面:
要求在页面间传递一个验证字符串,在生成页面的时候随机产生一个字符串,做为一个必须参数在所有连接中传递。同时将这个字符串保存在session中。
点连接或者表单进入页面后,判断session中的验证码是不是与用户提交的相同,如果相同,则处理,不相同则认为是重复刷新。
在处理完成后将重新生成一个验证码,用于新页面的生成
最简单的方法,ajax提交的表单内容添加一项,表明是ajax的请求,这时不做时间对比,否则就是真正的页面刷新,进行时间对比,这样不行吗?
应该是要对某个用户的频繁访问做控制吧,Apache下有一个模块mod_evasive,可以实现这个功能
页面重复刷新,是不是get请求?
如果是的话,那么直接用get和post区分刷新和表单提交就可以了,你只需要限制get请求就ok了。
其实你可以通过一段时间内的访问次数还限制恶意刷新行为,我给你个例子:
<?php
/**
* 将一些请求数据放到CACHE,判断请求次数,如果超过请求次数就暂停
*
* @param object $ca Mcmcache对象
* @param string $key 键值名称
* @param int $expire cache过期时间
* @param int $num 次数
* @return boolean
*/
function isAttack($ca,$key,$expire=3600,$num=10)
{
$loadnum = $ca->Get($key);
if(empty($loadnum))
{
$loadnum = 1;
$ca->Set($key,$loadnum,false,$expire);
}
$ca->Inc($key,1);
if(!empty($loadnum) && is_numeric($loadnum))
{
if(intval($loadnum)>intval($num))
{
return false;
}
}
return true;
}
$cache = Cache::Instance();
$isattack = isAttack($cache,"ACK_DENY_".md5(getClientIP()),600,100);
if(!$isattack)
{
header("HTTP/1.1 404 Not Found");
exit;
}
?>