【问题标题】:How do i prevent one specific view in codeigniter not to be accessed directly via url?如何防止无法通过 url 直接访问 codeigniter 中的一个特定视图?
【发布时间】:2014-09-16 16:13:42
【问题描述】:

在视图中我有两个文件夹页面,模板。内页我有两个文件夹非会员和会员。 在模板里面我有 header.php 和 footer.php。 在非成员文件夹中,我有一个通知文件 email_notification.php 以及其他文件,例如 home.php、about.php 等

页面正在使用以下函数动态生成

public function index(){
    $this->nonmember();
  }

public function nonmember($page = 'home'){ 

   if (! file_exists(APPPATH.'views/pages/nonmember/'.$page.'.php')) {
    show_404();
   }

   $data['title'] = ucfirst($page);

   $this->load->view('templates/header', $data);
   $this->load->view('pages/nonmember/'.$page, $data);
   $this->load->view('templates/footer', $data);

  }

并调用它以显示登录页面或注册页面

public function registration(){
//validation rules

   if($this->form_validation->run()){
    //add user to a temporary table
    //send an email with an activation code
    $this->nonmember('email_notification'); 
   //that view says click the link in email for activating account
     }else{
    $this->nonmember('registration');
    }
}

问题是 email_notification 视图也可以通过 url 访问,这是不可取的。 如何防止 email_notification 直接访问?就像用户尝试使用 url 访问它一样 我想将它们重定向回主页,或者 show_error() ?

【问题讨论】:

  • 我建议你设置一个会话变量,如果视图不存在就不要加载它。
  • 显示email_notification
  • @DwayneTowell email_notification 只是一个正文部分,表示已发送一封带有激活链接的电子邮件,单击该链接激活您的帐户。但请参阅我自己的答案,我按照 James Lator 的建议使用。

标签: php codeigniter


【解决方案1】:

为了防止导航到视图的文件,即http://[application_root]/application/views/pages/nonmember/email_notification.php

您可以在 CodeIgniter 文件的开头使用以下 sn-p:

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

如果您尝试阻止 Web 访问显示此页面的控制器操作,则可以使用 CLI 实用程序:Codeigniter 2 restrict controller to command line

【讨论】:

    【解决方案2】:

    只需将其设为“私有”方法即可。您可以使用关键字 private(类似于将单词 public 放在方法之前)——并且 codeigniter 允许您创建一个私有方法,方法名称前只有一个下划线

        function index(){
    
           $this->_nonmember();
    
          }
    
        function _nonmember($page = 'home'){
    
      … etc etc
    

    很多优点——不暴露私有方法名,以后如果需要可以更改方法名

    function index(){
    
       $this->_someNewNonMemberMethod();
    
      }
    

    但对于用户来说是完全一样的。

    ======== 编辑

    嗯,有许多不同的解决方案,这取决于您希望如何设计您的应用程序。就像一个考虑因素是为成员和非成员设置单独的控制器。但是对于您发布的代码,您已经有一个单独的注册方法,因此如果您不想暴露,最快的方法是为电子邮件视图创建一个快速的私有方法。

    public function registration(){
    //validation rules
    
       if($this->form_validation->run()){
        //add user to a temporary table
        //send an email with an activation code
    
        // make this method private
        $this->_nonmemberEmailNotify() ; 
    

    【讨论】:

    • 如果我将非会员设为私有方法,由于我的路由设置,我无法访问页面。 $route['(:any)'] = 'main/nonmember/$1';
    【解决方案3】:

    正如 James Lalor 已经提到的,使用 session 是一个很好的解决方案。 我所做的只是在$this-&gt;nonmember('email_notification'); 之前我正在使用

    创建一个会话
    $this->session->set_userdata('email_notification' => 1);
    

    在非成员函数中,我只是检查该会话是否设置为 1。

    if ($page == 'email_notification' && $this->session->userdata('email_notification') != 1) {
         redirect($this->agent->referrer());
       }
    

    稍后当用户激活他们的帐户时,我正在销毁会话

    【讨论】:

    • 这个方法意味着如果用户在收到邮件之前关闭浏览器,它可能无法正常工作,因为会话将丢失。这取决于会话和 cookie 的配置方式。
    • 用户只需要一次就可以看到 email_notification 页面。在他们点击提交注册按钮后,他们重定向到它。所以他们只有在点击提交按钮后才能关闭浏览器。如果他们留在网站上并激活了帐户,但仍想尝试访问该 email_notification 页面,则他们不会导致我在单击激活链接后立即破坏会话。主要问题是通过 url 直接访问 email_notification。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多