CodeIgniter CSRF никогда не работает с первой попытки - PullRequest
0 голосов
/ 27 ноября 2018

У меня странная проблема, и я не могу найти решение.Я активировал csrf в конфигурационном файле CodeIgniter.Когда я пытаюсь войти, первая попытка всегда терпит неудачу.Все следующие попытки работают.Он работает на моем локальном MAMP, но когда я помещаю его на свой веб-сервер, у меня возникает эта странная проблема.Ошибка, которую я получаю: Запрошенное вами действие не разрешено.

Моя конфигурация.

$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 голосов
/ 27 ноября 2018

Попробуйте сформировать вызов, как это, и не нужно

<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>

Вы можете попробовать использовать его

<?php echo form_open('login/connect', array('class' => 'login-form')); ?>
-----------------------------
<?php echo form_close(); ?>

Надеюсь, это работает.Я использую это и работаю Спасибо

0 голосов
/ 27 ноября 2018

Хэш восстанавливается, вы должны использовать класс, который предоставляет, а не статический.

Попробуйте это:

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