CodeIgniter CSRF永远不会在第一次尝试时起作用

时间:2018-11-27 10:21:57

标签: php codeigniter csrf

我有一个奇怪的问题,但找不到解决方案。我在CodeIgniter配置文件中激活了csrf。当我尝试登录时,第一次尝试总是失败。接下来的所有尝试均有效。它可以在我的本地MAMP上运行,但是当我在Web服务器上推送它时,我遇到了一个奇怪的问题。我得到的错误: 您请求的操作是不允许的。

我的配置。

$config['base_url'] = 'https://www.xy.de/test1/';
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();

我的观点:

<?= form_open('login/connect' , ' class="login-form" '); ?>
        <div class="input-group mb-3">
                <input required type="text" name="fUsername" class="form-control rounded-input" placeholder="<?= $this->lang->line('username_or_email_placeholder'); ?>" aria-label="Username" aria-describedby="basic-addon1">
            </div>
            <div class="input-group mb-3">
                <input required type="password" name="fPassword" class="form-control rounded-input" placeholder="******" aria-label="password" aria-describedby="basic-addon1">
            </div>
            <div class="w-100 text-center">
                <button class="loginButton" type="submit" name="fLogin"><span><?= $this->lang->line('login'); ?></span></button>&nbsp;
                <a href="<?= base_url() ?>recover/request" id="forgotPassword"><?= $this->lang->line('forgot_password'); ?>?</a>                    
            </div>
        <?= form_close() ?>

控制器:

public function index()
    {
        if($this->LoginModel->isLoggedIn()){
            if($this->LoginModel->isUserSuperAdmin($this->session->idUser)){
                redirect("cms/dashboard");
            }else {
                redirect("cms/profile");
            }
        }else{
            $this->load->view("cms/login", array("title" => SITE_TITLE . " - " . $this->lang->line("login")));
        }
    }

public function connect()
    {
            $login = trim($this->input->post("fUsername"));
            $password = $this->input->post("fPassword");
            if ($this->LoginModel->login($login, $password)) {
                if ($this->LoginModel->isUserSuperAdmin($this->session->idUser)) {
                    redirect("cms/dashboard");
                } else {
                    redirect("cms/profile");
                }
            }

        redirect("cms");
    }

2 个答案:

答案 0 :(得分:0)

哈希正在重新生成,您应该使用提供的类,而不是静态的类。

尝试一下:

<input type="hidden" name="<?=$this->security->get_csrf_token_name();?>" value="<?=$this->security->get_csrf_hash();?>" />

答案 1 :(得分:0)

尝试像这样进行通话,不需要

insert

它会自动设置为表格 您的表单调用是:

<input type="hidden" name="csrf_test_name" value="60bcd04d35e8e0ce9508a474e9d704da">     

您可以尝试使用它

<form action="https://www.xy.de/test1/login/connect" class="login-form" method="post" accept-charset="utf-8">

---------------------------
---------------------------
</form>

希望它能正常工作。我用它工作 谢谢