php
  • codeigniter
  • 2016-11-12 7 views 0 likes 
    0

    私はCodeIgniterでtodoリストを作成しています。CodeIgniterを使用してリストエンティティを安全に削除する方法

    この方法では、現在ログインしているユーザーが作成したすべてのリストを取得できます。 I以下

    <?php 
         $this->db->from('lists'); 
         $current_user = $this->session->userdata('email'); 
         $st="list_by='".$current_user."'"; 
         $this->db->where($st, NULL, FALSE); 
         $q = $this->db->get(); 
    
         foreach ($q->result() as $key => $row) { 
          echo "<li>" . $row->listTitle; 
         } 
    ?> 
    

    この削除ボタンを持っている:私の質問は、私はid="<? $row->id;?>を追加した場合、ユーザーは自分が作成しただけのリストを削除できるようにする方法、である

    <a class="delete_button" onclick="return confirm('Delete list?');" href="<?php echo site_url('lists/list_delete');?>" ><i class="icon-cancel"></i></a> 
    

    、私はブラウザでコードを調べることができますidを別の値に変更し、他の誰かからリストを削除します。

    これを保護する最善の方法は何ですか?

    +0

    )あなたのフォームにAjax機能を追加することができますが、それは別の質問のトピックの唯一の方法は、その現在のユーザserver__ __onチェックすることですリストの所有者。 –

    +0

    @u_mulderもう一度質問していただきありがとうございます。ボタンからIDの値を取得し、コントローラ/リストに移動して、現在この1つの関数list_deleteに移動します。 'public function list_delete(){ $ this-> db-> delete( 'lists'、array( 'id' => '1')); リダイレクト( 'lists'); } ' –

    +0

    私はcodeigniterに慣れていませんが、'/lists/list_delete/ID'のようにURLを構築することができます。ここで 'ID'はリストのIDです。または、フォームを作成し、フォームフィールドとしてIDを渡して 'submit'イベントを処理します。 –

    答えて

    0

    あなたは、クライアント側のフォームを操作からユーザーを停止することはできません。サーバー側で検証を行う必要があります。たとえば、コントローラのListsにあります。

    まずは、URLに、リストのIDを追加してみましょう、そうリンクは次のようになります。コントローラで

    <a class="delete_button" onclick="return confirm('Delete list?');" href="<?php echo site_url("lists/list_delete/{$row->id}");?>" ><i class="icon-cancel"></i></a> 
    

    class Lists extends CI_Controller { 
    
        public function list_delete($list_id) { 
         // 1. Check if the list found by $list_id belongs to the logged-in user 
         // 2. If it is, delete the list 
         // 3. If it's not, throw an exception, or redirect back with an error 
        } 
    } 
    
    +0

    IDよりもリストのcsrfハッシュを使用していただきありがとうございます。 –

    +0

    いいえ、まったくありません。 **正しく実装されていれば、 'GET'要求はCSRF保護を備えた' POST'要求と同じくらい安全です。確認を正しく行うようにしてください。 – sepehr

    +0

    私はCSRFリンクを削除しました。答えはGETリクエストに関するものです。 – sepehr

    0

    あなたのリストのuser_idと比較して、あなたのリストからuser_idを比較する必要があります。また、CSRF保護を使用することをお勧めします。セッションのuser_idと他の値で暗号化された鍵を作成し、サーバーへの各要求の値を入力し、サーバーでキーを解読し、そのキーのデータがセッション中のユーザーのデータに対応するかどうかを確認します。

    それとも、CodeIgniterのにCSRFの保護を有効にすることができます。

    https://www.codeigniter.com/userguide3/libraries/security.html

    0

    ユーザーができるかどうかを確認するための唯一の信頼できる方法リストを削除する - 現在のユーザがそのようなIDを持つリストの所有者である場合、サーバをチェックしてください。

    サーバにリストIDを渡す方法について:このアプローチについて 悪いことがある最も単純メソッドは、削除URLにIDがリストのID(例:/lists/list_delete/21)である/lists/list_delete/IDのようなものを作成することです

    • 単純な$_GETリクエストを使用すると、悪意のある人が削除URLを作成するのは非常に簡単です。

    • だからこそ、このような種類のリクエストに対してのみ、より深く、$_POSTリクエストを使用する必要があります。このアプローチを使用しますが、各リストのための小さなフォームを作成し、サーバー上のPOSTリクエストを処理することができます。

      <form action="/lists/list_delete"> 
          <input type="hidden" name="list_id" value="LIST ID HERE" /> 
          <input type="submit" name="delete" value="DElete this list" /> 
      </form> 
      

      この場合であっても、あなたがCSRFを回避し、トークンを使用するようにしてください。すでに述べたように - さらに行くhttps://www.codeigniter.com/userguide3/libraries/security.html#cross-site-request-forgery-csrf

    このURLを確認 -

    +0

    だから、GETリクエストが安全でないと言っているのは、悪者によって作成されやすいからです。 –

    +0

    'まったく'?あなたは私の答えにこれらの言葉を見ますか? –

    +0

    暗黙のうちにはい。あなたは「だから、私たちはもっと深く行き、$ _POST要求**を使うだけです**」と言いました。 –

    関連する問題