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;
    }

如果用户在弹出窗口中单击“确定”,则该消息将被删除。

问题是如何将令牌添加到链接和用户会话并验证它等。我不知道如何实现这一点才能正常工作。

编辑:我只是想我必须在链接末尾添加生成的令牌,例如:

帐户/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 回答