2012-01-08 13 views
3

免責事項:私はWeb開発を初めて利用しています。CodeIgniterアプリケーションのURLセキュリティ

シナリオ:イベントカレンダーとして最もよく説明されるCodeIgniterを使用してアプリケーションを構築しました。アプリケーションには、イベントカレンダーを他の人と共有できる共有機能があります。ログインすると、ユーザーは共有ページに移動し、イベントカレンダーを共有しているユーザーのリストから選択できます。ユーザーは彼らと彼らのイベントカレンダーを共有している人の名前を選択したときに、現在、以下のURIが生成されます。

http://example.com/folder/controller/method/id 

idセクションでは、自分が共有しているユーザーのデータベースでowner_idです個人とのカレンダー。

問題:URLのidセクションを別のユーザーのowner_idデータベースに変更するのは簡単です。これにより、誰でもイベントカレンダーの共有を許可していない個人のイベントカレンダーにアクセスできます。

質問:このセキュリティギャップを解決する方法はありますか?私が提供する必要があるものが他にあるかどうか教えてください。また、より明確な方法で説明してください。あなたの時間とエネルギーに感謝します。

モデル

class Shares_model extends crud_model { 

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

     $this->pk = 'id'; 
     $this->table_name = 'shares'; 
    } 

    public function get($shared_to_user_id) 
    { 
     $this->db->where('shared_to_id', $shared_to_user_id); 
     $ids = parent::get_all(); 

     $users = array(); 

     foreach ($ids as $id) 
     { 
      $users[$id->owner_id]['owner_id'] = $id->owner_id; 
      $users[$id->owner_id]['owner_first_name'] = $id->owner_first_name; 
      $users[$id->owner_id]['owner_last_name'] = $id->owner_last_name; 
     } 

     return $users; 
    } 
} 

ビュー

<div class="panel"> 
    <h4>Shared Planners</h4> 
     <ol> 
      <?php foreach($sharers as $s): ?> 
      <li><a href="<?php echo base_url('user/shared/view/'.$s['owner_id']) ?>"><strong><?php echo $s['owner_first_name']." ".$s['owner_last_name'] ?></strong></a></li> 
      <?php endforeach; ?> 
     </ol> 
</div> 

コントローラー:あなたはキープテーブルを持つことができ

class Shared extends Common_Auth_Controller { 

    private $end_user; 

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

     $this->end_user = $this->ion_auth->user()->row(); 
     $data['end_user'] = $this->end_user; 
     $this->load->vars($data); 

     $this->load->model('events_model', 'events'); 
    } 

    public function index() 
    { 
     $title['title'] = 'Shared'; 

     $this->load->model('shares_model','shares'); 

     $data['sharers'] = $this->shares->get($this->end_user->id); 

     $this->load->view('public/head_view', $title); 
     $this->load->view('user/header_view'); 
     $this->load->view('user/shared_view', $data); 
     $this->load->view('user/footer_view'); 
    } 
+0

あなたのイベント/カレンダーの認証テーブルを持っているのはなぜですか? – Peter

答えて

5

はあなたが CodeIgniters Encryption-Libraryを使用してURLを確保することができ、以下のロジック

<?php 
      // Check if user is logged in 
      if (!$this->ion_auth->logged_in()) 
      { 
       //Not logged in , so redirect them to login page 
       redirect('account/login', 'refresh'); 
      } 

      else{ 
      // So the user is logged in 
      // Get the id of the currently logged in user (The user who is trying to view the page) 
      $current_user = $this->ion_auth->get_user(); 
      $current_userid = $current_user->id; 


      // you need an array of users who have been invited to that event by the event creator 
      // As you mentioned you are storing the users who have been invited in db, get the ids to an array 

      $invited_users = getIdsOfusers(); 

      if (in_array($current_userid, $invited_users)) { 
       // Yes, The user who is trying to view the page has access 
       // you can show him the respective view 
      } 
      else { 
       // No, The user who is trying to view the page Doesn't have access 
       show_error('You dont have access !' ,500); 
      } 
    } 

    ?>  
1

ユーザーがアクセスできるすべてのカレンダーを追跡します。ユーザーがカレンダーにアクセスしようとしたときに最初に行うことは、そのユーザーがカレンダーにアクセスすることを許可されているかどうかを確認することです。

+0

データベースは、カレンダーの所有者と、そのカレンダーの表示を許可されているユーザーをすでに関連付けています。このプロセスを認証するか、別のユーザーのカレンダーにアクセスできないようにURLを保護するコードが必要です。 – imlouisrussell

4

これはアクセス権が入る場所です。基本的には、ページを読み込む前に、ユーザー(owner_id)が閲覧しているユーザーと実際に共有しているかどうかを確認してください。表示されていない場合は、エラーメッセージを表示するか、通常の方法で表示します。

1

を使用してください。

1

ログインしたユーザーだけが自分のカレンダーを表示したい場合は、URLを介してIDを渡す必要はありません。セッションからユーザーのIDを取得し、そのIDを使用してカレンダーデータを取得します。

許可された/記録されたユーザーに任意のユーザーのカレンダーが表示されるようにするには、ログインしているかどうかを確認するだけです。ログインしていない場合は、redirect()を使用してエラーページにリダイレクトします。

そして、招待ユーザーのチェックのために、単にデータベースから招待し、ユーザーのIDを取得し、ユーザーの特定ログに記録されたが招待されているかどうか、あなたが望むように、その後、リダイレクトチェックするin_array()を使用して...

1

あります安全なシステム内のページへの適切なアクセスを保証する2つの段階。

  1. 認証 - あなたが誰であるかを確認する必要があります。これは通常、Cookieを使用して、送信したユーザーがログインしているユーザーのセッションと一致することを確認します。このクッキーは、最初にログインしたときに生成したもので、データベースにトークンのコピーを保存します。ユーザーがページをリクエストするたびに、現在のPHPセッションがログインしているユーザーに属していて、ログインしていることを確認します。
  2. 認証 - AUTHENTICATEDユーザーが実際に何が表示されているかを判断します見ることを試みる。その人物が本当に彼らが誰であるかを知っていることはすべてうまくいいですが、それは平均的なジョーが何が彼のものであるかだけを見なければならないときに、全政府データベースにアクセスできるということを意味するものではありません。これはあなたの問題の重要な部分です - URIに渡されたIDは実際にはのユーザに属していますか?表示されている場合は、表示してください。それ以外の場合は、親友403が待機しています。

CodeIgniterフォーラムには、プラグインとして利用可能な認証/承認システムを設定するためのリソースがあります。

関連する問題