codeigniter を使用してアプリケーションを開発しています。このアプリケーションでは、ユーザーがログアウト ボタンをクリックするとセッションの設定が解除されますが、ブラウザの [戻る] ボタンをクリックすると、最後にログアウトしたページが表示されます。
この問題を解決するには?
codeigniter を使用してアプリケーションを開発しています。このアプリケーションでは、ユーザーがログアウト ボタンをクリックするとセッションの設定が解除されますが、ブラウザの [戻る] ボタンをクリックすると、最後にログアウトしたページが表示されます。
この問題を解決するには?
解決策は、POST とパターン PRG (POST-REDIRECT-GET) を使用することです。
ログアウト ボタンを作成します。
<?php echo form_open('logout');?
<button type="submit">Logout</button>
<?php echo form_close();?>
コントローラーで:
public function logout{
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// destroy session
$this->session->sess_destroy();
// redirect to other page
redirect('login', 'refresh');
}
}
これにより、「戻る」ボタンの問題が解決され、CSRF 攻撃にも役立ちます。
##Add this Code in Constructor ##
## start Constructor ##
//********** Back button will not work, after logout **********//
header("cache-Control: no-store, no-cache, must-revalidate");
header("cache-Control: post-check=0, pre-check=0", false);
// HTTP/1.0
header("Pragma: no-cache");
// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
//********** Back button will not work, after logout **********//
## End Constructor ##
public function index(){
redirect('home/logout');
}
public function home() {
$this->form_validation->set_rules('username', 'User', 'trim|required');
$this->form_validation->set_rules('password', 'Password', 'trim|required');
if($this->form_validation->run() AND $data['records'] =$this->task_model->check_login())
{
$this->session->set_userdata('logged_in',TRUE);
$this->load->view('home');
}
else {
redirect('task/logout');
}
}
public function logout(){
$this->session->unset_userdata('userid');
$this->session->unset_userdata('username');
$this->session->destroy();
redirect(base_url());
}
これを試してみてください。「戻る」ボタンの問題を解決します
私はすでにこの種のものを持っています、そして私がしたことはこれです:
あなたのhtaccessで:
<IfModule mod_headers.c>
Header add Cache-Control: "no-store, no-cache, must-revalidate"
</IfModule>
あなたの問題は、セッションの設定を解除すると前のページに戻れないように、キャッシュを自動的にクリアする必要があるということです(最後のページを表示することを意味します)。
PHPでやろうとしていた場合も同じ考えです。
/* content security */
function weblock() {
$ci =& get_instance();
$ci->load->library('session');
$ci->load->model('mlogin');
// clear cache to prevent backward access
$ci->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, no-transform, max-age=0, post-check=0, pre-check=0");
$ci->output->set_header("Pragma: no-cache");
// prevent unauthenticated access
if($ci->session->userdata('user_data')==FALSE) { redirect('clogin/logout');}
// prevent invalid authentication
if(!$ci->mlogin->authenticate()) { redirect('clogin/logout'); }
}
このような関数を作成してみてください。コントローラーの場合は、すべてのコンストラクトで呼び出すだけです。
これがあなたを啓発することを願っています:)