0

ログイン機能のある Web サイトで、CodeIgniter のセッションに関するいくつかの問題に直面しています。

  1. 本日、2 人のユーザーが、サインイン後にホームページにリダイレクトされるが、サインインしていないという問題を報告しました。ページを更新すると、サインインされます。さらに、ログアウトをクリックすると、サインインされません。ログアウトしました。後でページを更新すると、ログアウトされます。この問題はこれまで発生したことがなく (Web サイトはほぼ 1 年間稼働しています)、私のユーザー名/マシンにも表示されません。

  2. データベースのセッション テーブルに重複したレコード (同じ IP) があることに気付きました。

  3. 一部のユーザーは、別の人にログインしたと報告しています (上部のメッセージには、別の人の名前を使用して X を歓迎すると書かれています)。ユーザーが実際に別のユーザーの名前でログインする可能性がある問題について、コードを 4 重にチェックしましたが、穴は見つかりませんでした。

これらの問題を解決するためのヘルプとヒントをいただければ幸いです。ここに私のセッション設定があります:

$config['sess_cookie_name']     = 'ci_session';
$config['sess_expiration']      = 7200;
$config['sess_expire_on_close'] = TRUE;
$config['sess_encrypt_cookie']  = TRUE;
$config['sess_use_database']    = TRUE;
$config['sess_table_name']      = 'sessions';
$config['sess_match_ip']        = TRUE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update']  = 300;

これまでのところ、これらの設定が最適に機能することがわかりました。以下は、ログインコントローラー関数です。

public function index()
{        
    // if user is already logged in, redirect him to main
    if ($this->users_model->check_if_logged_in())
        redirect(site_url('gmat/' . format_gmat_url()));

    $this->load->library('form_validation');

    $this->form_validation->set_error_delimiters('', '');
    $this->form_validation->set_message('required', 'The credentials you entered are invalid.');
    $this->form_validation->set_rules('signin_email', 'Email', 'trim|required|max_length[100]|xss_clean');
    $this->form_validation->set_rules('signin_pswd', 'Password', 'trim|required|max_length[25]|md5|xss_clean');
    $this->form_validation->set_rules('signin_auth', 'Authorization Code', 'trim|required|max_length[100]|xss_clean');

    if ($this->form_validation->run() == FALSE)
    {
        $this->session->set_flashdata('error_msg', 'Invalid login, please try again.');
        redirect(site_url('gmat/' . format_gmat_url() . 'sign_up'));
    }
    else
    {
        // Check if user is valid
        $u_email = $this->input->post('signin_email');
        $u_password = $this->input->post('signin_pswd');
        $u_auth = (format_gmat_url() == 'lev2' && $this->input->post('signin_auth') == 0 ? 'notvalid' : $this->input->post('signin_auth')); // for level 2 sign in

        $login_result = $this->users_model->check_login($u_email, $u_password, 0, $u_auth);

        if ($login_result['success'] == TRUE)
        {
            redirect(site_url('gmat/' . format_gmat_url()));
        }
        else
        {
            $this->session->set_flashdata('error_msg', $login_result['error_msg']);
            redirect(site_url('gmat/' . format_gmat_url() . 'sign_up'));
        }
}
}

$u_auth および「レベル 2 サインイン」に関連するものは、ログインしているユーザーに別の「サブサイト」へのアクセスを許可します。メイン サイトのログイン ページは、それに関連するものや、認証コードによるサインインに関連するものは何も使用しません。

モデル関数 check_login:

public function check_login($email, $password, $admin = 0, $auth_code = 0)
{
    $login_result = array('success' => FALSE, 'error_msg' => '');

    $this->load->model('users_model');

    $user_condition = "u_email = '" . $email . "' AND u_password = '" . $password . "' AND u_authorized = '' AND u_active = 1";
    $user_condition .= ($admin == 1 ? " AND u_admin = 1" : "");
    $user_condition .= ($auth_code != 0 ? " AND u_access_level2 = 1" : "");
    $user = $this->users_model->get_db_users($user_condition);

    $u_logged_in_level2 = FALSE;

    if(count($user) == 1)
    {
        if ($auth_code != 0 || $auth_code != '0')
        {
            $this->load->model('settings_model');

            // Signing in on level 2, check for authorization code
            $settings = $this->settings_model->get_db_settings("s_code = 'level_2_authorization'");

            if ($settings[0]['s_value'] != $auth_code)
            {
                $login_result['success'] = FALSE;
                $login_result['error_msg'] = 'Invalid authorization code.';
                return $login_result;
            }
            else
            {
                $u_logged_in_level2 = TRUE;
            }
        }

        $login_result['success'] = TRUE;

        $this->session->sess_destroy();
        $this->session->sess_create();

        // Create session data
        $data = array(
                'user_id' => $user[0]['u_id'],
                'user_email' => $email,
                'user_first_name' => $user[0]['u_first_name'],
                'user_family_name' => $user[0]['u_family_name'],
                'user_father_name' => $user[0]['u_father_name'],
                'user_mobile' => $user[0]['u_mobile'],
                'user_admin' => $user[0]['u_admin'],
                'access_level2' => $u_logged_in_level2,
                'logged_in' => TRUE
                );

        $this->session->set_userdata($data);
    }
    else
    {
        $login_result['error_msg'] = 'Invalid login, please try again.';
    }

    return $login_result;
}
4

1 に答える 1

1

ユーザーが他人の名前でログインしている場合、非常に悪い形になります。

セッション ライブラリを自動ロードすると、誰かがあなたの Web サイトにアクセスするたびに、ユーザー エージェントのセッションが自動的に作成されます。ポイントは、誰かがあなたのウェブサイトに明示的にログインした場合、同じセッションがユーザー データで更新される必要があるということです。

セッションライブラリを自動ロードしていると思います。セッション Cookie 名の名前を ci_session から cisession などに変更します。アンダースコアを削除してください。IE ではうまくいきません (素晴らしい Microsoft)。多くの場合に役立ちます。

セッションテーブルのスキーマを共有してください。user_agent フィールドには必ず varchar(255) を使用してください。その後、同じ IP とユーザー エージェントからデータベースに複数のセッションがあるとは思いません。

于 2013-09-12T12:54:41.863 に答える