Токены CSFR не позволяют войти в систему

#php #codeigniter

#php #CodeIgniter

Вопрос:

Я включил cookies и csrf для codeigniter для своих токенов. Но теперь не позволяет мне войти в систему. что я сделал не так.

Ошибка Запрошенное вами действие не разрешено.

 $config['sess_cookie_name'] = 'sessions';
$config['sess_expiration'] = 7200;
$config['sess_expire_on_close'] = true;
$config['sess_encrypt_cookie'] = true;
$config['sess_use_database'] = TRUE;
$config['sess_table_name'] = 'sessions';
$config['sess_match_ip'] = TRUE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update'] = 300;

$config['csrf_protection'] = true;
$config['csrf_token_name'] = 'token';
$config['csrf_cookie_name'] = 'token';
$config['csrf_expire'] = 7200;
  

Я создал скрытый ввод <input type="hidden" name="token" id="token" value="<? php echo $token; ?>" /> для моего входа в систему просмотра

Также я установил сеансы

 $data = array(
'user_id' => $this->user_id,
'username' => $this->username,
'success' => "success",
'token' => md5(uniqid(rand(), true))
);

$this->CI->session->set_userdata($data);
  

Вот мой контроллер.

 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Login extends Controller {

   private $error = array();

   public function __construct() {
      parent::__construct();
      $this->load->library('user');
      $this->load->library('form_validation');
      $this->lang->load('common/login', 'english');
      if($this->session->userdata('user_id')) {
         redirect('dashboard');
      } else {
         return false;
         redirect('login');
      }
   } 

   public function index() {
      $this->form_validation->set_rules('username', 'Username', 'required|min_length[4]|max_length[12]');
      $this->form_validation->set_rules('password', 'Password', 'required|xss_clean');

      if($this->form_validation->run($this) == false) {

         $data['title'] = $this->lang->line('heading_title');

         $data['text_heading'] = $this->lang->line('text_heading');

         if (array_key_exists('warning', $this->error)) {
            $data['error_warning'] = $this->error['warning'];
         } else {
            $data['error_warning'] = '';
         }

         $data['action'] = site_url('login');

         $data['token'] = $this->session->userdata('token');

         $this->load->view('common/login', $data);

      } else{ 

         if(($this->validate() amp;amp; $this->input->post('token') ==  $this->session->userdata('token')) {

             redirect('dashboard');

            } else {

               $data['title'] = $this->lang->line('heading_title');

               $data['text_heading'] = $this->lang->line('text_heading');

               if (array_key_exists('warning', $this->error)) {
                  $data['error_warning'] = $this->error['warning'];
               } else {
                  $data['error_warning'] = '';
               }

               $data['action'] = site_url('login');

               $data['token'] = $this->session->userdata('token');

               $this->load->view('common/login', $data);

         }
      }
   }

   function validate() {
      $username = $this->input->post('username');
      $password = $this->input->post('password');

      if ($this->user->login($username, $password)) {
          return true;
      } else {
         $this->error['warning'] = $this->lang->line('error_login');
         return !$this->error;
      }
   }
}
  

Ответ №1:

Если вы используете CI из тега <?=form_open()?> , он автоматически сгенерирует токен, и если вы не используете это, вы должны сделать

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

Комментарии:

1. Я вижу теперь, так как я сделал это <?php echo form_open(‘login’);?> Я могу нормально войти в систему с включенным CSRF и включенными файлами cookie. Когда я использую формы, должен ли я полностью использовать открытую форму codeigniter. Как мне отобразить токен, чтобы убедиться, что он работает

2. вы можете использовать его с post, как это $this-> input->post(‘ci_csrf_token’);

3. Я добавил его в свои данные набора сеансов, но он не отображается.

4. Понял, я должен был это сделать $this->CI->security->get_csrf_hash()

5. приведенные выше коды сгенерировали скрытое поле с именем ci_csrf_token. вы можете получить значение этого скрытого поля в javascript или повторить его с помощью post. я не знаю, для чего вы хотите использовать значение. для проверки?