【问题标题】:Issues with my site's security built with codeigniter使用 codeigniter 构建的网站安全问题
【发布时间】:2015-11-23 16:02:05
【问题描述】:

我在保护我的网站免受攻击方面遇到了问题。

首先,我的网站是在测试服务器中订购的,结构如下

当我必须为管理面板定义安全性时,问题就出现了。

我想要什么:

  1. 避免在未登录站点的情况下直接访问控制器
  2. 为了防止我的网站被黑客攻击
  3. 为了保护我的数据库免受黑客攻击

我该怎么做?到目前为止,我所做的是:

在每个控制器中放置这段代码:

defined('BASEPATH') OR exit('No direct script access allowed');

我知道它应该防止直接访问控制器,但它不起作用...我可以访问而无需登录每个控制器中的每个功能..

我还编写了这个函数用于在会话中存储用户数据:

public function receiveLogin(){
    $this->load->library('form_validation');
    $this->load->library('session');
    $this->form_validation->set_rules('username', 'Username', 'required');
    $this->form_validation->set_rules('password', 'Password', 'required');

    if ($this->form_validation->run() == FALSE){
        $this->data['error_message'] = $this->form_validation->error_array();   
    }else{
        $username = $_POST['username'];
        $password = md5($_POST['password']);

        $user = $this->user_model->checkUserLogin($username,$password);

        if (!empty($user)){
            $admin_data = array(
                'admin_id' => $user->u_id,
                'admin_name' => $user->u_name,
            );
            $this->session->set_userdata($admin_data);
            redirect('admin/showDashboard');
        }else{
            $this->session->set_userdata('admin_id', 0);
            $this->data['error_message'] = 'Los datos de ingreso son incorrectos';
            redirect('login');
        }               
    }
}

我还为缩短 url 配置了路由,并且运行良好。

有人可以解释我如何完成我需要的吗?我发现的关于这方面的帖子并没有谈到我问过的这 3 个安全问题..

这方面的最佳做法是什么?

【问题讨论】:

  • @Mhakvoort 很抱歉,但我可以看到您的答案与您提到的帖子中的用户 coderabbi 重复,而不是我的问题
  • 首先,defined('BASEPATH') OR exit('No direct script access allowed'); 防止直接访问控制器文件——这意味着用户不能直接打开控制器的 php 文件。这并不能保护 ROUTE 免受直接访问 - 用户仍然可以访问访问此控制器文件的路由。这 if 仅检查文件是否通过 codeigniter 系统加载。您需要做的是检查用户是否已成功登录,并且对于您要保护的每个控制器方法都有一个活动会话。
  • @MikelBitson 不,我明白那部分......我仍在研究如何防止直接访问而不被记录
  • Limon,我在这里很困惑 - 你不会只是在你想要保护的任何方法的最顶部写一个检查,看看用户是否登录,如果他们是登录你做你的方法逻辑,如果会话没有设置并且他们没有登录它只会返回一个关于登录的错误或将用户重定向到登录页面?

标签: php codeigniter security url controllers


【解决方案1】:

我从您的评论中注意到您不想在每个功能中都包含登录检查,这是可以理解的,但不是必需的。

请记住,控制器只是一个类,因此您可以在构造函数中进行登录检查:

public function __construct(){
    parent:__construct();
    $this->loggedIn();
}

记得重写父构造函数,否则你的控制器可能无法正常工作。

另请注意,这将对控制器中的所有功能进行登录检查,因此您需要为未登录页面设置单独的控制器。

另一种巧妙的方法是使用traits,您至少需要 php 版本 5.4,但它对于抽象这样的逻辑非常有用。您可以创建一个进行登录检查的特征,将其包含在需要身份验证的控制器中,然后只需调用 $this->loggedIn() 或您在控制器函数顶部调用的任何需要用户登录的函数,如果用户未登录,则让 trait 重定向用户

【讨论】:

  • 可能建议在核心控制器中也这样做。
  • @killstreet 为什么将此功能放在核心控制器中更好?所以可以从其他每个控制器调用它?
  • 视情况而定,如果是管理面板,您每次加载管理面板内的页面时都使用构造函数执行它。
【解决方案2】:

最简单的事情是把你的应用程序和系统文件夹放在公共 html 文件夹的上一层,然后就什么都不能访问了!

application/public_html/
system302/public_html/
         /public_html/index.php 

在您的 index.php 文件中

$application_folder = '../application';
$system_path = '../system302';

用于登录——将您的登录检查代码放在模型之类的地方,自动加载模型使其始终可用,然后在类构造函数中调用登录。然后类中的所有方法都受到保护,并且您不会在控制器中重复一堆会话检查代码。

【讨论】:

  • 如果我这样做了如何配置路由?
  • 以及它应该如何通过网站的第一页找到我的主控制器?
  • 所以在 index.php 文件中,您可以设置应用程序和系统文件夹的位置。 “路线”从 index.php 文件开始。 Codeigniter 不需要您的控制器结构与服务器相同即可创建路由。但可能是最简单的,只需尝试一下,您就会看到它是如何工作的!
  • 我没有 index.php 文件,我的索引将是管理控制器(用于控制面板)中的一个函数,对于前端它是一个主类控制器
  • 不是控制器文件。它是 codeigniter 的主要 index.php。查看该文件,您会看到它加载了您的系统和应用程序。
【解决方案3】:

您可以获得的最佳安全性将是使用 htaccess,因为我还看到您正在尝试为管理面板创建安全性,这取决于您使用控制器的方式(有些人使用管理控制器来管理他们的所有内容面板)我建议使用核心控制器。 在核心控制器内部,您使用以下代码:

class MY_Controller extends CI_Controller{

    function __construct(){
        parent::__construct();
        if($this->uri->segment(1) == "admin"){
            $this->checkLoginAdmin();
        }
    }

    function checkLoginAdmin(){
        if(isset(!$this->session->userdata('admin_id'))){
            $this->session->set_flashdata("message", "You must login first.");
            redirect("admin/login");
        }
    }
}

请记住,您需要为此加载 uri 帮助程序,具体取决于您使用的 codeigniter 版本,我建议将其放入 CodeIgniter 的自动加载程序中。同样取决于管理面板的 URL,一旦您的 url 看起来像这样,此代码就会起作用:www.example.com/admin

如果您没有登录,即使访问 www.example.com/admin/test 也是不允许的。

【讨论】:

    【解决方案4】:

    CodeIgniter 输入类有一个名为 is_ajax_request() 的方法用于此目的。

    if ($this->input->is_ajax_request()) {
        //do something
    } 
    else {
        show_error("No direct access allowed");
        //or redirect
    } 
    

    【讨论】:

    • 我没有看到他要求只接受 Ajax 请求?即使他这样做了,伪造一个 ajax 请求就像添加一个标头一样简单。
    • 你说得对,但这是该问题的规范 CodeIgniter 解决方案
    • 但是如果他不使用Ajax,这会让他的脚本失败吗?
    • 与问题完全无关。当然不是“该问题的规范 CodeIgniter 解决方案”,因为它甚至与问题无关......
    猜你喜欢
    • 2011-04-07
    • 1970-01-01
    • 2011-03-25
    • 2017-09-25
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多