Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用Codeigniter限制登录尝试3次_Php_Codeigniter - Fatal编程技术网

Php 使用Codeigniter限制登录尝试3次

Php 使用Codeigniter限制登录尝试3次,php,codeigniter,Php,Codeigniter,我目前正在开发一个系统。我已经在我的登录模块中完成了,但我想进行一些登录尝试。该用户将只有3次尝试登录,如果超过3次限制,则该用户的电子邮件将被停用或将被处以5分钟的罚款 我不知道如何开始,但我知道的事情;您需要获得用户的ip地址,检查该电子邮件的尝试次数 用户表 name (varchar) email (varchar) password (varchar) confirm password (varchar) attempts (int) ip_address (varchar) sta

我目前正在开发一个系统。我已经在我的登录模块中完成了,但我想进行一些登录尝试。该用户将只有3次尝试登录,如果超过3次限制,则该用户的电子邮件将被停用或将被处以5分钟的罚款

我不知道如何开始,但我知道的事情;您需要获得用户的ip地址,检查该电子邮件的尝试次数

用户表

name (varchar)
email (varchar)
password (varchar)
confirm password (varchar)
attempts (int)
ip_address (varchar) 
status (varchar)
控制器

public function login()
{
         if($this->form_validation->run('login_validate') == FALSE) 
    {

        echo json_encode(validation_errors());
    } 
    else 
    {
        $email = clean_data($this->input->post('email'));
        $password = clean_data($this->input->post('password'));
        $where = array('email'=>$email);
        $get_user = $this->Crud_model->fetch_tag_row('*','users',$where);

        if($get_user) 
        {
            $check_password = $get_user->password;

            if($this->session->tempdata('penalty'))
            {
                echo json_encode("Your account is ". $_SESSION['penalty']. " on penalty");

            } 
            else 
            {
                if(password_verify($password,$check_password)) 
                {

                    if($get_user->status == 'Active') 
                    {
                            $user_session = [
                            'id'            => $get_user->id,
                            'first_name'    => $get_user->first_name,
                            'middle_name'   => $get_user->middle_name,
                            'last_name'     => $get_user->last_name,
                            'email'         => $get_user->email,
                            ];

                            $this->session->set_userdata('logged_in',$user_session);
                            $session = $this->session->userdata('logged_in');                  
                            $this->session->user_id          = $session['id'];
                            $this->session->email       = $session['email'];
                            $this->session->fullname    = $session['first_name'] .' '. $session['middle_name'] .' '. $session['last_name'];
                            echo json_encode("success");
                    }
                    else if ($get_user->status == 'Inactive')
                    {
                    echo json_encode("Your account is inactive. Contact our human resource department regarding this problem.");
                    }

                }
                else 
                {
                    $attempt = $this->session->userdata('attempt');
                    $attempt++;
                    $this->session->set_userdata('attempt', $attempt);

                    if($attempt == 3)
                    {
                        echo json_encode("Your account is locked");

                        $this->session->set_tempdata('penalty', true, 10);
                        $this->session->set_userdata('attempt', 0);

                    }
                    else
                    {
                        echo json_encode("Invalid Credentials");
                    }

                }
            }     
        }
        else
        {
            echo json_encode("Invalid Credentials");
        } 
    }
}
注:以上是我的登录功能。它工作正常(我对字段的验证,如果帐户存在,用户名和密码正确等)。Fetch->tag->row将只获取特定的行


问题:有人能告诉或指导我如何尝试登录吗?

我认为您不需要使用IP,如果使用会话变量会怎么样

例如,当打开登录页面时,sess var将设置为0,并且在每次错误时将其增加1

此外,在验证用户并通过之前,检查sess var是否小于或等于3,如果小于或等于3,则给出消息,说明他们需要等待,如果不是,则处理登录

现在,如果您希望在重试之前实施5分钟的惩罚,您可以在会话变量中使用tempdata,如果tempdata设置为true,则仍处于惩罚时间,否则,您可以处理登录

你可以参考


希望它能起作用

嗨,先生,谢谢你给我的建议。我已经完成了第一部分。检查登录尝试,现在我如何实施5分钟惩罚?又有导游吗?我更新了控制器的最后一个问题,如果我想在消息中显示时间惩罚,该怎么办?我试图按照指南操作,但它只显示为“您的帐户被罚款1”。如何显示5分钟?(我将其更改为10秒以加快调试速度)您可以不将惩罚设置为true,而是将其设置为当前时间,然后在验证会话var惩罚是否为true时,验证if!=null,如果它不同于null,则获取它的值(发生3次登录失败时捕获的时间),然后将其与当前时间进行比较。这会给你时间上的差距,你就能得到剩余的点球时间。希望它能帮助我知道这是一个老问题,但我永远不会为此使用会话。用户可以删除会话cookie以删除块。因此,最好将ip+尝试存储在数据库中。
public function login() {
    if ($this->form_validation->run('login_validate') == FALSE) {
        echo json_encode(validation_errors());
    } else {
        $email = $this->input->post('email');
        $password = $this->input->post('password');
        $where = array('email' => $email);
        $get_user = $this->Crud_model->fetch_tag_row('*', 'users', $where);

        if ($get_user) {
            $check_password = $get_user->password;
            if($this->session->tempdata('penalty')){
                //Shows code that user is on a penalty
            }else{
                if (password_verify($password, $check_password)) {

                    if ($get_user->status == 'Active') {
                        $user_session = ['id' => $get_user->id, 'first_name' => $get_user->first_name, 'middle_name' => $get_user->middle_name, 'last_name' => $get_user->last_name, 'email' => $get_user->email,];

                        $this->session->set_userdata('logged_in', $user_session);
                        $session = $this->session->userdata('logged_in');
                        $this->session->user_id = $session['id'];
                        $this->session->email = $session['email'];
                        $this->session->fullname = $session['first_name'] . ' ' . $session['middle_name'] . ' ' . $session['last_name'];
                        echo json_encode("success");
                    } elseif ($get_user->status == 'Inactive') {
                        echo json_encode("Your account is inactive.");
                    }

                } else {
                    $attempt = $this->session->userdata('attempt');
                    $attempt++;
                    $this->session->set_userdata('attempt', $attempt);

                    if ($attempt == 3) {
                        echo json_encode("Your account is locked");
                        $this->db->set('attempts', 'attempts+120', FALSE);
                        $this->db->where($where);
                        $this->db->update('users'); // gives UPDATE mytable SET field = field+1 WHERE id = 2
                        $attempt = 0;

                        //code for setting tempdata when reached maximun tries
                        $this->session->set_tempdata('penalty', true, 300); //set the name of the sess var to 'penalty, the value will be true and will expire within 5 minutes (expressed in sec.)


                    } else {
                        echo json_encode("Invalid Credentials");
                    }
                }
            }

        } else {
            echo json_encode("No account found");
        }
    }
}