您现在的位置是:网站首页 > 心得笔记

PHP中通过session()限制同一IP多次提交

盛悦2019-01-18495人围观
简介绝大多数网站中,都不希望同意用户同一时间段内不断的提交数据,就像我博客中的留言板块,肯定不希望同意用户不断的通过恶意的留言来刷新我的接口,这样极大的增加了我服务器的压力,这时候就需要限制下

一、场景

绝大多数网站中,都不希望同意用户同一时间段内不断的提交数据,就像我博客中的留言板块,肯定不希望同意用户不断的通过恶意的留言来刷新我的接口,这样极大的增加了我服务器的压力,这时候就需要限制下

二、方案

public function store (Request $request,Message $message) {//此处不用管,是我注入进来的Reuquest和模型
    session_start();//注意:使用session之前一定要加上此行!
    $now = time();//获取当前时间
    $timeout = 60*5;//我此处设置的限制时间是5分钟
    if (isset($_SESSION['last_submit']) && $now - $_SESSION['last_submit'] <= $timeout) {//判断是否超出限制时间
        $alert = ['type'=>'error','data'=>'提交太快!'];
    } else {
        $result = $message->fill($request->all())->save();
        $alert = ($result) ? ['type'=>'success','data'=>'留言成功!'] : ['type'=>'error','data'=>'留言失败!'];
    }
    $_SESSION['last_submit'] = $now; //走到这里一定是该用户留言成功了,此时记录该条记录的提交时间
    return redirect('/about')->with('am-alert',$alert);
}

三、注意事项

  • 用$_SESION之前必须要session_start()开启一个会话

  • session_start必须要在所有的输出echo前面,否则不起作用


四、补充

/**
 * 功能:获取当前客户端IP地址
 */
public static function getIPaddress() {
    $IPaddress = '';
    if (isset($_SERVER)) {
        if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            $IPaddress = $_SERVER["HTTP_X_FORWARDED_FOR"];
        } else if (isset($_SERVER["HTTP_CLIENT_IP"])) {
            $IPaddress = $_SERVER["HTTP_CLIENT_IP"];
        } else {
            $IPaddress = $_SERVER["REMOTE_ADDR"];
        }
    } else {
        if (getenv("HTTP_X_FORWARDED_FOR")) {
            $IPaddress = getenv("HTTP_X_FORWARDED_FOR");
        } else if (getenv("HTTP_CLIENT_IP")) {
            $IPaddress = getenv("HTTP_CLIENT_IP");
        } else {
            $IPaddress = getenv("REMOTE_ADDR");
        }
    }
    return $IPaddress;
}