0

パスワードリセットページを作成しています。このアクションの最後のステップで、ユーザーがパスワードを入力し、パスワードをもう一度入力して確認します。2つの入力が比較され、これらの入力が等しい場合はパスワードが変更され、そうでない場合はパスワードが変更されます。ユーザーは「成功メッセージなし」のページに移動します。

これが私の論理です:

パスワードリセットページ:

echo form_open( "login / password_reseter");

私のコントローラー:

   function password_reseter() {
        $password1 = $this->input->post('password');
        $password2 = $this->input->post('password2');
        if ($password1 == $password2) {
            $data["proof"]=1;
            $reg_code = $this->input->post('rec_code');
            $this->load->model("membership_model");
            $this->membership_model->password_reseter($reg_code, $password2);
        }
        else{
            $data["proof"]=0;
        }

        $data["main_content"] = "reset_password_result";
        $this->load->view("includes/template", $data);
    }

そしてビュー

<?php
if ($proof == 1) {
    ?>
    <div id="loginform">
        Your password has been changed, you may now login.
    </div>
    <?php
} else {
    ?>
    <div id="loginform">
        Your passwords don't match! <a href="javascript:history.back()">Go back.</a>
    </div>
    <?php
}
?>

セキュリティ上の大きな問題がありますが、このページにURLで直接アクセスすると、データベース上のすべてのアカウントのパスワードがリセットされます。このpassword_reseterページへの直接アクセスを停止したいと思います。

4

5 に答える 5

3

パスワード1とパスワード2を比較するだけなので、コードは失敗します。

ユーザーがpassword_reseter関数に直接アクセスする場合、password1はnullであり、password2はnullであるため、「テスト」に合格します。

さらに、「$ this-> input-> post('rec_code')」をチェックします。これもnullになります。

モデルコード内では、「$ this-> input-> post('rec_code')」がnull(またはfalse)であるため、WHERE条件ですべてのユーザーが取得され、すべてのパスワードがリセットされます。

ここには非常に多くのセキュリティ問題があります。上記の1つの問題を修正することすらしませんが、問題を修正する方法の概要を説明します。

私はこれを言います-不快感はありません-しかし、あなたは認証ライブラリを書くべきではありません。codeigniter用に準備されたGOODSTRONGSECURITYに焦点を当てたライブラリが非常に多いため、そのうちの1つを使用する必要があります。

私はion_authをお勧めしますが、tank_authcommunity_authも非常に優れています。

于 2012-09-29T12:07:48.437 に答える
1

ユーザーが前の手順を完了したときに、いくつかのセッション変数を設定する必要があります。次に、 password_reseterをチェックします。*これらのセッション変数が設定されているかどうか*設定されていない場合は、目的の場所にリダイレクトします。

于 2012-09-29T13:13:41.343 に答える
0
if (!$_SERVER['HTTP_REFERER'])
{
    $this->redirect('error');
}
于 2016-02-16T12:07:17.530 に答える
0

CI_組み込み機能を使用してパスワード検証を行うことをお勧めします。

$ autoload ['libraries'] = array('database'、'email'、'form_validation');

$ autoload ['drivers'] = array('session');

CI_CONTROLLER

function save_password_change(){
        $this->form_validation->set_rules('password','password','trim|required|min_length[4]|xss_clean');
        $this->form_validation->set_rules('password_confirm','Password Confirmation','trim|required|matches[password]');
        if($this->form_validation->run() === FALSE){
            echo " Password Change Unsuccessful";
        }
        else{
            $this->load->model('model_password_mgr');       
            $return_value = $this->model_password_mgr->save_password(); 
            if(!$return_value)
                echo " Password Change Unsuccessful ";
            else {
                echo " Password Change Successful";
                redirect("home");
            }   
        }
    }

CI_MODEL

function save_password(){
    $this->db->where('email', $_SESSION['email'] );
    $arr = array( 'password' => $this->input->post('password'));
    $data = $this->db->update('users', $arr);
    if(!$data)
        echo "PASSWORD CHANGE UNSUCCESSFUL";
    else 
        return true;
}
于 2016-06-16T13:23:55.607 に答える
-1

htaccessを使用してファイルをブロックすることは、1つの解決策になります。

<files login/password_reseter.php>
order allow,deny
deny from all
</files>
于 2012-09-29T11:54:11.847 に答える