如何防止黑客从外部访问用户会话?

时间:2016-06-27 19:18:18

标签: php facebook codeigniter security session

我们有一个使用CodeIgniter的网站。我们使用Facebook SDK将令牌连接并存储在会话变量中。我们有控制器函数,由AJAX代码调用并在我们的数据库中创建条目。但要创建条目,会话变量应该有效。

最近有人找到了攻击我们的方法并假装他有一个有效的会话并调用这些函数并在我们的网站上创建了许多数据库条目。我们现在被迫关闭网站进行一些更改以防止这种情况发生。

但我们不是PHP程序员,我们是C / C ++程序员,不知道这个人是怎么做到的。我们知道他使用了卷曲库7.43.0。

有人可以帮助我们纠正我们的代码吗?顺便说一句,我们不是一个HTTPS网站。

以下是CodeIgniter的会话配置:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 1800;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = TRUE;
$config['sess_time_to_update'] = 60;
$config['sess_regenerate_destroy'] = TRUE;

这是cookie配置:

$config['cookie_prefix']    = 'liftoffre_';
$config['cookie_domain']    = $domain;
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE;
$config['cookie_httponly']  = FALSE;

以下是在数据库上创建条目之前用于验证会话的代码:

public function create_offer()
{
    if($this->session->userdata('token') != null)
    {
        $titre = "Nouvelle offre";

        $data = array(
            'userGraph' => $this->session->userdata('userData'),
            'titre' => $titre
        );

        $this->load->view('nouvelle_offre', $data);
    }
    else
    {
        redirect('/main/');
    }
}

public function ajouter_offre()
{
    if($this->session->userdata('token') != null) {
        $data = array(
            'offre_departure_name' => $this->input->post('offre_departure_name', TRUE),
            'offre_departure_adresse' => $this->input->post('offre_departure_adresse', TRUE),
            'offre_departure_province' => $this->input->post('offre_departure_province', TRUE),
            'offre_departure_city' => $this->input->post('offre_departure_city', TRUE),
            'offre_arrival_name' => $this->input->post('offre_arrival_name', TRUE),
            'offre_arrival_adresse' => $this->input->post('offre_arrival_adresse', TRUE),
            'offre_arrival_province' => $this->input->post('offre_arrival_province', TRUE),
            'offre_arrival_city' => $this->input->post('offre_arrival_city', TRUE),
            'offre_datetime' => $this->input->post('offre_datetime', TRUE),
            'offre_price' => $this->input->post('offre_price', TRUE),
            'offre_seats_number' => $this->input->post('offre_seats_number', TRUE),
            'offre_userid' => $this->input->post('offre_userid', TRUE),
            'offre_commentaire' => $this->input->post('offre_commentaire', TRUE),

        );

        $this->load->model('Datasource');
        $this->Datasource->add_offer($data);
    }
    else
    {
        redirect('/main/');
    }
}

可以使用POST方法调用这两个函数,并调用domain.com/index.php/controller/function等链接。

这是来自服务器的日志

209.222.7.236 - - [27/Jun/2016:06:50:33 -0700] "POST /index.php/nouvelleoffre/ajouter_offre/ HTTP/1.1" 200 - "-" "curl/7.43.0"

有人知道如何帮助我们吗?

1 个答案:

答案 0 :(得分:0)

CodeIgniter虽然无可争议地是最好的PHP框架之一,但它存在一个不能正确存储会话的问题,即它只是以加密格式存储在COOKIE中的SESSION数据。因此,在充分了解您的系统和使用的散列算法的情况下,攻击者可以将所有cookie数据转换为会话数据。然而,在CodeIgniter v3发布之前,此问题已得到解决。 但我认为存储会话的最佳方式可能是:

1.不要自动加载会话类,而是在需要时加载它们 2.定义基本路径或出口,即defined('BASEPATH') or exit('No direct script access allowed') 3.虽然过度拉伸,但我建议您在存储之前设置加密密钥并加密每个会话值(请记住设置强加密密钥密码)