2016-05-09 19 views
-1

私は現在、複数の異なるアクセスレベルを持つ小さなPHPサイトを作成しています。一部のユーザーはすべての部分(a、b、c、d)にアクセスでき、一部のユーザーは特定の部分(b、dなど)にのみアクセスできます。配列で安全なPHP関数?

現在、私はユーザがログインしており、ユーザ名とパスワードがmysqlデータベースに保存されている資格情報と照合されています。さらに、ログイン時には、ユーザーがアクセスできるすべての機能を列挙した配列を作成します。次に、配列をセッション変数に格納します。各PHPページは、ページの上部に次のコードを上に持って、

session_start(); 
if (!isset($_SESSION["is_auth"])) { 
    header("location: login.php"); 
    exit; 
    } 

私の質問は、私は機能/ページへのアクセスを制限する方法に、 のですか?それぞれの関数をもう一度呼び出して、ユーザーが関数にアクセスできるかどうか、または特定の関数がユーザーセッションに格納されている配列内にあることを確認するだけで十分であるかどうかを確認する必要があります。

ありがとうございました!

+0

しばらくしてdbを呼び出すと、セッションにアクセスできる可能性があります –

+0

これを行うための組み込み方法はありません。自分でロジックを書きます。あなたが提供したコードに基づいて、あなたはすでにそのようなコードを書く方法の基礎をはっきりと知っています。今は創造的で実装する必要があります。私はあなたが得る答えを一切使っていないでしょう。 –

答えて

0

セッションのコンテンツは、クライアントがアクセスできないため安全であると見なすことができます。

ログインプロセスが$_SESSIONオプションを設定している場合は、これを確認できます。

session_start(); 
if (!isset($_SESSION["is_auth"])) { 
    header("location: login.php"); 
    exit; 
} 
// empty() matches to bool(false) and int(0), but throws no notice if index is undefined. 
if (empty($_SESSION["allowed_area"]["area_a"])) { 
    header("location: access_denied.php"); 
    exit; 
} 
0

セッション変数が安全であるため、各ページのデータベースでユーザーの資格情報を確認する必要はありません。

あなたの管理パネルでユーザーを削除したり、アカウントをロックしたり、パスワードを変更したり、そのユーザーが既にログインしていた場合は、しばらくしてから確認することができます。その場合、データベース内でユーザーがログアウトされないようにして、ブラウザを閉じるまで(彼はあなたのウェブサイトにログインしたままにしておくことはできません)、この可能性を考慮する必要があります。

2番目の問題は、誰かが自分のウェブサイトを使用しているよりも有効なユーザーのセッションCookieを取得した場合のセッションハイジャックです。したがって、各ページでsession_regenerate_id(true);を使用して、新しいセッションIDがユーザーに割り当てられ、以前のユーザーIDが削除されるようにする必要があります。

0

サーバーの任意のリソースでどのユーザーにもアクセスを許可する方法については、セッションのすべてのデータを保存してから、各ユーザーの要求で、ユーザー(またはむしろ、ユーザーの役割)には、このリソースにアクセスするのに十分な権限があります。

私はcodeigniterとしてフレームワークを使用することが推奨されています(それはどのように動作するか、何千ものチュートリアルがあります)、Ben Edmunds製のライブラリ呼び出しion-authがあります。ログイン、サインアップ(アカウントを有効にするための自動電子メール送信 - 設定する場合)、回復パスワード、ユーザーにアクセスするための安全な機能の2つがあります。権限については

、私が使用することは、このライブラリです:

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

class Permissions 
{ 

    public function __construct() 
    { 
    } 

    public function __call($method, $arguments) 
    { 
     if (!method_exists($this->ion_auth_model, $method)) 
     { 
      throw new Exception('Undefined method Ion_auth::' . $method . '() called'); 
     } 

     return call_user_func_array(array($this->ion_auth_model, $method), $arguments); 
    } 

    public function __get($var) 
    { 
     return get_instance()->$var; 
    } 

    public function control(){ 
     // controla la session 

     if(!$this->session->userdata('id')) redirect(base_url("/login"), "refresh");  

     // valida los permisos 
     $group = $this->permissions_model->lookUpGroup($this->session->userdata('user_id')); 
     $menu = $this->permissions_model->lookUpPermission($this->uri->segment(1), $group->group_id); 
     //echo "url: ".$this->uri->segment(1)." grup: ".$group->group_id."<br>"; 
     //var_dump($menu); 
     //die(); 
     if((!$menu || empty($menu)) || $menu->read == 0 && $menu->menu_id != 12){ 
      redirect(base_url("/dashboard"), "refresh"); 
     }   

     // retorna permisos 
     $menu = $this->permissions_model->getByLink($this->uri->segment(1)); 
     return $permisos = $this->permissions_model->permissions($menu->id, $this->session->userdata('user_id')); 

    } 

    public function getMenu(){ 
     $ci = &get_instance(); 
     if($ci->session->userdata("id")) 
     { 
      $user_id = $ci->session->userdata("id"); 
      $father_query = "SELECT u.id usuario, ug.user_id, ug.group_id, p.menu_id, p.read, p.insert, p.update, p.delete, p.group_id, m.* 
      FROM users u 
      JOIN users_groups ug  ON u.id = ug.user_id 
      JOIN permisos p    ON ug.group_id = p.group_id 
      JOIN menus m    ON p.menu_id = m.id 
      WHERE u.id = ".$user_id." AND m.active=1 
      AND m.parent=0 
      ORDER BY m.orden 
      "; 
      $query_padres = $ci->db->query($father_query); 

      if($query_padres->num_rows()>0) 
      {  
       foreach($query_padres->result() as $field) 
       { 
        $consulta_hijos = "SELECT u.id usuario, ug.user_id, ug.group_id, p.menu_id, p.read, p.insert, p.update, p.delete, p.group_id, m.* 
        FROM users u 
        JOIN users_groups ug  ON u.id = ug.user_id 
        JOIN permisos p    ON ug.group_id = p.group_id 
        JOIN menus m    ON p.menu_id = m.id 
        WHERE u.id = ".$user_id." AND m.active=1 
        AND m.parent=".$field->id." 
        AND p.read=1 
        ORDER BY m.orden"; 
        $sub_query = $ci->db->query($consulta_hijos); 
        if($sub_query->num_rows()>0){ 
         $submenus = ''; 
         $active_menu = ''; 
         $active_menu_collapse = ''; 
         foreach ($sub_query->result() as $result_dos) { 
            if ($ci->uri->segment(1) == $result_dos->link && $ci->uri->segment(2) == $result_dos->sublink) { 
             $submenus .= "<li class='active'><a href='". base_url($result_dos->link."/".$result_dos->sublink)."'><i class='".$result_dos->iconpath."'></i> ".$ci->lang->line($result_dos->descripcion)."</a></li>"; 
             $active_menu = 'active'; 
             $active_menu_collapse = 'collapse in'; 
            }else{ 
             $submenus .= "<li><a href='". base_url($result_dos->link."/".$result_dos->sublink)."'><i class='".$result_dos->iconpath."'></i> ".$ci->lang->line($result_dos->descripcion)."</a></li>"; 
            } 
         } 

         echo "<li class='".$active_menu."'> 
            <a href='javascript:;'><i class='".$field->iconpath."'></i><span class='title'>".$ci->lang->line($field->descripcion)."</span><span class='arrow'></span></a> 
            <ul class='sub-menu'> 
            ".$submenus." 
            </ul> 
           </li>"; 
        } 
        else if (($ci->uri->segment(1) == $field->link && $ci->uri->segment(2) == $field->sublink) || $ci->uri->segment(1) == '') { 
         echo " <li class='active'> 
            <a href='".base_url($field->link."/".$field->sublink)."'> 
             <i class='".$field->iconpath."'></i> 
             <span class='title'>".$ci->lang->line($field->descripcion)." 
             <span class='selected'></span> 
            </a> 
           </li>"; 
        }else{ 
         echo "<li> 
           <a href='".base_url($field->link."/".$field->sublink)."'> 
            <i class='".$field->iconpath."'></i> 
            <span class='title'>".$ci->lang->line($field->descripcion)."</span> 
            <span class='selected'></span> 
           </a> 
          </li>"; 
        } 

       } 
      } 
     } 
    } 
} 

本の後、私は(1あなたは正しいアクセスを保証するすべてのコントローラを拡張し、そこから)コアフォルダの父コントローラを作成。コアフォルダ上のコントローラの例:

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

class Main_Father extends CI_Controller { 

    public function __construct() { 
     parent::__construct(); 
     //session_start(); 
     $this->load->helper('url'); 
     if($this->getPermissions()) 
     { 
      //make some things before pass control to the authentic controller 
     } 
     else 
      redirect(base_url()); 
    } 
    private function getPermissions() 
    { 
     $this->user = $this->ion_auth->user()->row(); 
     if($this->user) 
     { 
      //$this->data["permissions"] = $this->permissions->control(); 
      if($this->permissions->control()) 
      { 
       //make any function 
       return true; 
      } 
      else return false; 
     } 
     else 
     { 
      if(strpos(base_url(uri_string()),"login")==false) 
       redirect(base_url('/login'.$url)); 
      else return false 
     } 
    } 
} 

最後の要素...Permission_model

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
class Permissions_model extends CI_Model { 

    function __construct() { 
     parent::__construct(); 
    } 


    function get_all(){ 
     $query = $this->db->get('groups'); 
     return $query->result(); 
    } 

    function getAll(){ 
     $user_row = $this->ion_auth->user()->row(); 
     if (!$this->ion_auth->in_group(1, $user_row->id)){ 
      $query = $this->db 
       ->select('p.*, g.name AS grupo, m.descripcion AS menu') 
       ->join('groups g','p.group_id = g.id') 
       ->join('menus m', 'p.menu_id = m.id') 
       ->where('p.group_id !=', 1) 
       ->get('permisos p'); 
     }else{ 
      $query = $this->db 
       ->select('p.*, g.name AS grupo, m.descripcion AS menu') 
       ->join('groups g','p.group_id = g.id') 
       ->join('menus m', 'p.menu_id = m.id') 
       ->get('permisos p');  
     } 
     return $query->result(); 
    } 

    //buscar 
    function lookUp(/*$perpage,$start*/){ 
     $query = $this->db 
      ->select('permisos.id AS id, 
      menus.descripcion AS menu, 
      groups.id AS id_grupo, 
      groups.description AS grupo, 
      permisos.read AS Leer, 
      permisos.insert AS Insertar, 
      permisos.update AS Actualizar, 
      permisos.delete AS Borrar, 
      permisos.exportar AS Exportar, 
      permisos.imprimir AS Imprimir') 
      ->join('menus',  'menus.id = permisos.menu_id', 'inner') 
      ->join('groups', 'groups.id = permisos.group_id', 'inner'); 

     if($where = $this->input->post('buscar', TRUE)) 
      $query = $this->db->where('permisos.id =', $where) 
       ->or_where("menus.descripcion LIKE '%".$where."%'") 
       ->or_where("groups.description LIKE '%".$where."%'"); 

     $query = $this->db 
      ->get('permisos'); 
     return $query->result('array'); 
    } 

    //count_buscar 
    function count_lookUp($perpage,$start){ 
     $query = $this->db 
      ->join('menus',  'menus.id = permisos.menu_id', 'inner') 
      ->join('groups', 'groups.id = permisos.group_id', 'inner'); 
     if($where = $this->input->post('buscar', TRUE)) 
      $query = $this->db->where('id =', $where); 
     $query = $this->db->limit($perpage,$start) 
      ->get('permisos'); 
     return $query->num_rows(); 
    } 

    function getByLink($link){ 
     $query = $this->db 
      ->select('id') 
      ->where('link',$link) 
      ->get('menus'); 
     return $query->row(); 
    } 
    //buscarPermiso 
    function lookupPermission($url, $perfil){ 
     $query = $this->db 
      ->select('p.read,p.menu_id') 
      ->join('menus m', 'm.id = p.menu_id') 
      ->where('p.group_id', $perfil) 
      ->like('m.link', $url) 
      ->get('permisos p'); 
     return $query->row(); 
    } 
    //buscarGrupo 
    function lookUpGroup($usuario){ 
     $query = $this->db 
      ->select('group_id') 
      ->where('user_id', $usuario) 
      ->get('users_groups'); 
     return $query->row(); 
    } 
    function permissions($menu, $id_usuario) { 
     $query = $this->db 
      ->select('u.id, up.group_id, p.*') 
      ->join('users_groups up', 'up.user_id = u.id') 
      ->join('permisos p', 'p.group_id = up.group_id') 
      ->where('u.id =', $id_usuario) 
      ->where('p.menu_id =', $menu) 
      ->limit('1') 
      ->get('users u'); 
     return $query->row(); 
    } 
} 

私はそれがあなたを助けることを願っています。

PS:1º)getMenu関数が大好きではありません。MVCパターンの大砲を尊重しません。また、クエリは安全ではありません(パラメータ化されたメソッドを使用する必要がありますか?)。 2º)この関数で作成されたHTMLは変更できます。 3º)ここに記述されているコードのほとんどは私のものではありません... ion_authライブラリはBen Edmundsによって作成され、パーミッションコードは未知の「アーティスト」によって作成されています。 4º)あなたが厄介であれば、permissions_modelアップグレード可能なものには多くのものがあります...

+0

詳細なコメントをありがとう! – linuxisthebest33

関連する問題