我正在构建密码重置页面,在此操作的完成步骤中,用户输入密码并通过再次输入密码进行确认,比较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页面。
答案 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_auth和community_auth也相当不错。
答案 1 :(得分:1)
当用户完成上一步时,您应设置一些会话变量。然后检查 password_reseter * ,如果这些会话变量已设置 *,如果没有重定向它们到您想要的位置。
答案 2 :(得分:0)
if (!$_SERVER['HTTP_REFERER'])
{
$this->redirect('error');
}
答案 3 :(得分:0)
$ 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>