Codeigniter - 停止直接访问页面

时间:2012-09-29 11:48:34

标签: php codeigniter

我正在构建密码重置页面,在此操作的完成步骤中,用户输入密码并通过再次输入密码进行确认,比较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页面。

5 个答案:

答案 0 :(得分:3)

您的代码失败,因为您所做的只是将密码1与密码2进行比较。

如果用户直接访问password_reseter函数,则password1为null,password2为null,因此它通过了'test'。

此外,您还会检查“$ this-&gt; input-&gt; post('rec_code')”,它也将为空。

我打赌你的模型代码中,因为“$ this-&gt; input-&gt; post('rec_code')”为null(或false),你的WHERE条件会获得所有用户,从而重置所有用户你的密码。

这里有很多安全问题,我甚至不会解决上面的一个问题,但是概述了如何解决这个问题。

我会这样说 - 没有冒犯 - 但你不应该写一个身份验证库。有很多准备好的GOOD STRONG SECURITY专注于codeigniter的库,你应该只使用其中一个。

我建议ion_auth,但tank_authcommunity_auth也相当不错。

答案 1 :(得分:1)

用户完成上一步时,您应设置一些会话变量。然后检查 password_reseter * ,如果这些会话变量已设置 *,如果没有重定向它们到您想要的位置。

答案 2 :(得分:0)

if (!$_SERVER['HTTP_REFERER'])
{
    $this->redirect('error');
}

答案 3 :(得分: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;
}

答案 4 :(得分:-1)

使用htaccess来阻止文件将是一个解决方案:

<files login/password_reseter.php>
order allow,deny
deny from all
</files>