#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. я не знаю, для чего вы хотите использовать значение. для проверки?