我是Codeigniter PHP的新手。我开发了一个简单的用户 管理系统在此用户登录时我已经设置了数据库会话。一世 在注销时也会销毁它们。我的缓存也被关闭了。甚至 虽然当我点击浏览器上的后退按钮时,我可以看到我的 仪表板,如果我点击任何链接然后它重定向我登录,但它 首先向我展示仪表板,这是一个错误。请帮帮我解决 它
控制器我有logins.php:
<?php
class Logins extends CI_controller{
public function index(){
$this->load->view('login');
}
public function getdata(){
$name = $this->input->post('name');
$pass =$this->input->post('pass');
$this->db->where('name =', $name);
$this->db->where('pass =',$pass);
// $this->db->where('status =', 'registered');
$query=$this->db->get('form');
if($query->num_rows()== 1)
{
$newdata = array(
'name' => $name
);
$this->session->set_userdata($newdata);
//echo $name;
$this->load->view('match',$name);
}else
{
redirect('logins');
// $this->load->view('login');
}
}
public function userlogout(){
$this->session->unset_userdata('name');
redirect('logins');
}
}
?>
查看页面我有match.php:
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div>
<?php
$session_id = $this->session->userdata('name');
echo "Hi $session_id U Logged In";
?>
</div>
<div style="text-align:right;">
<a href="<?php echo base_url()?>logins/userlogout">Logout</a>
</div>
</body>
</html>
当我点击后退按钮时,它会再次显示登录页面。
请帮我解决这个问题我是codeigniter的新手。
答案 0 :(得分:1)
&#34;禁用codeigniter中的后退按钮?&#34; - CodeIgniter不可能
为什么不可能?
CodeIgniter是
Server Side Scripting Web Framework
,仅限它 负责它自己的环境而不是客户端,例如喜欢 JavaScript的。因此,CI (CodeIgniter) does not affect Browser's Activity
。
现在,假设您想要 Prevent Views/Content being display for Un-Authorized User
,当用户注销并尝试通过点击浏览器返回时看到仪表板或任何其他内容(仅针对登录用户)按钮。
基本上,浏览器维护自我会话(活动)的工作速度非常简单,我们可以在提交表单后通过后退按钮查看表单中的旧输入数据。因此,一旦用户填写登录表单并提交表单,他们将在登录/仪表板页面上重定向,一旦他们点击退出按钮CI就会销毁用户的会话数据。但是在这个故事的旁边 Browser Cache the Content and Form Data
&amp;因此,当用户点击历史记录后退按钮时,他们仍然可以看到来自数据或缓存内容。
那么,我们能做什么?
好吧,我们可以在 Cache Headers
中使用 Application Response
来告诉浏览器,&#39;嘿! Mozilla / Chrome /浏览器 Do Not Cache/Store
此页面,它不是可缓存的&amp;永远敲门。但是......在这种情况下仍然存在一个小问题..
哦不!现在:(?
好吧,缓存标头将通过从浏览器历史记录中删除内容来阻止内容显示。但是,如果某个页面被任何类型的表单提交所逗乐,那么很可能用户可能会要求 Confirm Form Submission
&#39;。如果他们只是再次提交表格或按F5&#39;按钮表格将通过相同的先前数据或表格输入再次提交。
好的,那么我们如何处理CodeIgniter中的确认表单提交..
我们可以使用 OTT (One Time Token), CSRF (Cross-Site Request Forgery) Protection or Any Other Method which is Intend to Made only for One Time
。像CI一样,每次都有CSRF Regenerate选项来创建一个新的CSRF Toke。您可以在CSRF部分 application/config.php
的 $config['csrf_regenerate']
中找到该选项,只需将其设为$config['csrf_regenerate'] = TRUE
。
仍然可以提交表单..?
哦,是的!为什么......因为您设置了 $config['csrf_regenerate'] = TRUE;
但 $config['csrf_expire']
仍然有很长的时间来过期旧CSRF令牌。因此,如果您设置$config['csrf_expire'] = 60;
,那么您将无法通过浏览器返回按钮提交缓存表单。因为旧的CSRF令牌已过期&amp; CI在2分钟后没有认出相同的旧表格,我们在这里待了2分钟的Expire CSRF令牌...... Yuhooo !!
嘿嘿!!似乎它已经解决了:)是的!
这是全新的Controller Logins.php代码:
<?php
// security first always....
(defined('BASEPATH') or exit('No direct script access allowed'));
/**
* Class Controller
*
* Class Logins Controller to handle login & logout
*/
class Logins extends CI_controller
{
/**
* Class Constructor
*/
public function __construct()
{
// execute parent class constructor
parent::__construct();
// load helpers
$this->load->helper(array('form', 'url', 'security'));
// load lib
$this->load->library('form_validation');
// prevent from Browser Cache
$this->output->set_header('Last-Modified: ' . gmdate("D, d M Y H:i:s") . ' GMT');
$this->output->set_header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
$this->output->set_header('Pragma: no-cache');
$this->output->set_header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
}
/**
* Default method to execute if method name missing
* @return [type] [description]
*/
public function index()
{
// check if user login or not
if (!$this->session->userdata('name')) {
// show login view
$this->load->view('match');
}
// if already logged in, show other view
else {
// get name from session login flag
$name = $this->session->userdata('name');
// load view
$this->load->view('match', $name);
}
}
/**
* login Form POST Method to verify Users identity
* @return [type] [description]
*/
public function getdata()
{
// if POST made then only
if ($this->input->post()) {
$rules = array(
array(
'field' => 'name',
'label' => 'Name',
'rules' => 'trim|required|xss_cleaned|min_length[3]|max_length[25]',
),
array(
'field' => 'pass',
'label' => 'Secret Password',
'rules' => 'required',
),
);
// form validation
$this->form_validation->set_rules($rules);
// check validation
if ($this->form_validation->run() === false) {
$this->load->view('match');
} else {
// safe from CSRF, use 2nd param as TRUE in POST
$name = $this->input->post('name', true);
$pass = $this->input->post('pass', true);
// Query Where Conditioning
$array = array('name' => $name, 'pass' => $pass, 'status' => 'registered');
// produces: WHERE name = 'user-name' AND pass = '***' AND status = 'registered'
$this->db->where($array);
// get from MySQL Table
$query = $this->db->get('form');
// if result
if ($query->num_rows() > 0) {
$sess_login = array(
'name' => $name,
);
// set session login flag
$this->session->set_userdata($sess_login);
// load view
$this->load->view('match', $name);
} else {
redirect('logins');
}
}
} else {
redirect('logins');
}
}
/**
* Log Out Method
* @return [type] [description]
*/
public function userlogout()
{
$this->session->unset_userdata('name');
redirect('logins');
}
}
这是全新的视图match.php代码:
<?php
$name = $this->session->userdata('name');
?>
<!DOCTYPE html>
<html>
<head>
<title>CodeIgniter First Login</title>
<link rel="stylesheet" type="text/css" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="jumbotron vertical-center">
<?php if ($name !== false): ?>
<div class="container">
<div class="alert alert-success">Wohoo!! You made it.. <?php echo $name ?> <a href="<?php echo base_url()?>logins/userlogout" class="btn btn-danger">Log Out</a></div>
</div>
<?php else: ?>
<div class="container">
<?php echo (validation_errors()) ? '<div class="alert alert-danger">'.validation_errors().'</div>' : ''; ?>
<?=form_open('logins/getdata', 'class="form-controller"'); ?>
<fieldset>
<legend>Login Information</legend>
<div class="form-group">
<label for="name">Name</label>
<input type="text" class="form-control" name="name" id="name" placeholder="Please enter your user name here" value="<?php echo set_value('name'); ?>">
</div>
<div class="form-group">
<label for="password">Secret Password</label>
<input type="password" class="form-control" id="password" name="pass" placeholder="Please enter your password here" value="<?php echo set_value('pass'); ?>">
</div>
</fieldset>
<div class="form-group row">
<div class="offset-sm-2 col-sm-10">
<button type="submit" class="btn btn-primary">Sign in</button>
</div>
</div>
<?=form_close();?>
</form>
</div>
<?php endif ?>
</div>
</body>
</html>
<强>的config.php 强>
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 120; // 2 minutes
$config['csrf_regenerate'] = TRUE;
答案 1 :(得分:0)
控制器: - 在仪表板视图加载
的构造函数中检查会话是否存在{{1}}
答案 2 :(得分:0)
尝试一下。
public function getdata()
{
ini_set('session.cache_limiter','public');
session_cache_limiter(false);
}