【问题标题】:Codeigniter: How to handle direct link to controller/function/param?Codeigniter:如何处理与控制器/功能/参数的直接链接?
【发布时间】:2010-04-06 18:35:09
【问题描述】:

我有一个简单的控制器函数,它删除一个数据库条目(它使用模型函数来执行此操作)。我在我的一个视图中有一个链接(例如http://www.example.com/item/delete/3),我正在使用 jQuery 来显示一个确认对话框,以确保用户确实想要删除它。一切都好。但是,如果您只是在浏览器中输入该 URL,则该项目会在没有警告的情况下被删除。

有没有办法以我对控制器功能或模型进行编码的方式来处理这个问题?

【问题讨论】:

    标签: codeigniter controller


    【解决方案1】:

    对于删除操作,我会做一个 HTTP 帖子。

    function delete()
    {
        if ($id = $this->input->post('id'))
        {
            $this->item_model->delete_item($id);
        }
    }
    

    然后我的 JQuery 会做一个 HTTP 帖子。

    $.ajax({
        type: 'POST',
        url: 'item/delete',
        data: {id:item_id}
    });
    

    这样,客户就不会通过在其网络浏览器中浏览 URL 意外删除项目。

    【讨论】:

    • 更不用说如果您使用 GET,CSRF 攻击可能更容易。有人可以发布类似 example.com/item/delete/3' ?> 的内容,如果管理员用户查看了它,删除功能就会触发。当然,同样的事情也可以用一个帖子来完成,但我认为这会更困难。
    【解决方案2】:

    您可以通过将此行添加到模型和控制器文件 (CI Forum post) 的顶部来防止这种情况发生。

    <?php if (!defined('BASEPATH')) exit('No direct script access allowed');
    class SomeModel extends Model
    {
    // model code
    }
    ?>
    

    这确保 CI 已加载。

    【讨论】:

    • 我的控制器文件中已经有了它;这不会阻止通过 URL 访问该函数。
    【解决方案3】:

    我想我想通了,那就是在控制器中将函数设为私有,即

    function _delete($id) {
     ...delete code goes here...
    }
    

    【讨论】:

    • 如果你这样将其设为私有,人们如何有目的地获取它?不确定这是不是最好的方法,但我一直将人们引导到另一个页面,在那里他们确认他们想要删除该项目,然后他们发布到确认方法。我检查他们是否已发布并处理该操作。
    【解决方案4】:

    这是通过 AJAX 请求吗?如果是这样,我会通过 POST 而不是 GET 将数据发送到删除,这样就无法直接导航到。

    如果是通过 GET,我想在点击链接时会引发确认警告,我会在您直接转到页面时加载它。

    您也可以检查引荐来源网址,只有在引荐页面有效的情况下才能正常工作,但这种方法并不总是 100% 可靠。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多