3

CodeIgniter のフォームで CSRF を有効にする方法は知っていますが、この機能を CodeIgniter のクラシック リンクに実装する方法がわかりません (たとえば、管理領域でプライベート メッセージや投稿などを追加/削除するため)。

今、私はこのようなものを使用しています:

見る

<?php echo anchor('account/delete_private_message/'.$obj->pmID, 'delete mesage', array('onclick' => 'return confirm(\'Do you really want to delete this private message?\');', 'class' => 'delete-message-button')); ?>

コントローラ

function delete_private_message($pmID = '')
    {

        $deleted_pm = $this->account_model->delete_pm($pmID);

        if($deleted_pm)
        {
            $this->session->set_flashdata('status', 'PM was deleted successfully');
        }
        else
        {
            $this->session->set_flashdata('status', 'Error');
        }
        redirect('account/private_messages');
    }

モデル

function delete_pm($pmID)
    {

        $return = 0;
        if(!empty($pmID))
        {
            $this->db->where('pmID', $pmID);
            $result = $this->db->delete('private_messages');
        }
        return $result;
    }

ユーザーがポップアップで [OK] をクリックすると、メッセージは削除されます。

問題は、トークンをリンクとユーザーのセッションに追加して検証する方法などです。これを適切に機能させる方法がわかりません。

編集:生成されたトークンをリンクの最後に追加する必要があると思います:

アカウント/delete_private_message/1239/dfdf6e7re67a6e87r6e87r69876bn3

値 dfdf6e7re67a6e87r6e87r69876bn3 も現在のユーザーのセッションにあり、コントローラーでそれらを確認します。とはいえ、具体的にどうすればいいのかわからない。だから、どんな助けも大歓迎です。

4

1 に答える 1

3

正解です。リンクの一部としてCSRFトークンを渡すだけです。以下の例が役立つはずです(しかし、私はそれをテストしていません)

function delete_private_message($pmID = '', $token = null)
{
    // Check supplied token is valid
    if ( ! ($this->_check_token($token)))
    {
        // Not valid
        $this->session->set_flashdata('status', 'Error');
        redirect('account/private_messages');
    }


    if($this->account_model->delete_pm($pmID))
    {
        $this->session->set_flashdata('status', 'PM was deleted successfully');
    }
    else
    {
        $this->session->set_flashdata('status', 'Error');
    }
    redirect('account/private_messages');
}


function _check_token ($token)
{
      return ($token === $_COOKIE[$this->csrf_cookie_name]);
}

psモデルコードにエラーがあります

$return = 0;

する必要があります

$result = 0;
于 2012-09-16T10:09:22.050 に答える