【问题标题】:CodeIgniter Form Validation OrderCodeIgniter 表单验证顺序
【发布时间】:2012-10-28 15:49:29
【问题描述】:

我有一个带有验证的登录表单,除了一个用例之外,它都可以工作。

如果用户输入有效的电子邮件地址且没有密码,我只希望显示“需要密码”消息,但现在会出现“需要密码”消息和“电子邮件/密码不正确”消息。

我明白为什么,但不知道如何更改此代码,以便回调仅在其他验证已通过时运行。

public function login_validation() {
    $this->load->library('form_validation');
    $this->form_validation->set_rules('email', 'Email', 'required|valid_email|trim|xss_clean|callback_validate_credentials');
    $this->form_validation->set_rules('password', 'Password', 'required|md5');
    $this->form_validation->set_error_delimiters('<div class="alert alert-error">', '</div><br />');

    if ($this->form_validation->run()) {
        $data = array(
            'email' => $this->input->post('email'),
            'staff_logged_in' => 1
        );
        $this->session->set_userdata($data);
        redirect('clock/clock');
    } else {
        $this->load->view('login/login');
    }
}

public function validate_credentials() {
    $this->load->model('staff_model');

    if ($this->staff_model->can_log_in()) {
        return true;
    } else {
        $this->form_validation->set_message('validate_credentials', 'Incorrect Email/Password');
        return false;
    }

}

【问题讨论】:

  • 不,不,你没有。您所做的是绝对正确的,只需将消息更改为“对不起,电子邮件和密码的组合与我们的记录不匹配”之类的内容永远不要告诉人们哪个部分是错误的,它只会让黑客获得部分登录信息。跨度>
  • 瑞克,我不会告诉人们哪个部分失败了。问题是它向他们展示了我在他们输入密码之前检查了数据库。当密码为空时调用回调,我试图完全避免回调,直到电子邮件和密码都通过初始验证。

标签: forms validation codeigniter


【解决方案1】:

不要使用表单验证本身来验证凭据。无论如何,这实际上只是为了验证我对它的理解的输入。您必须将输入单独传递给函数,因为它不会将它们与 form_validation 库一起使用。下面是这样的。

public function login_validation() {
$this->load->library('form_validation');
$this->form_validation->set_rules('email', 'Email', 'required|valid_email|trim|xss_clean');
$this->form_validation->set_rules('password', 'Password', 'required|md5');
$this->form_validation->set_error_delimiters('<div class="alert alert-error">', '</div><br />');

if ($this->form_validation->run()) {
    $this->validate_credentials($this->input->post($email),$this->input->post($password));
    $data = array(
        'email' => $this->input->post('email'),
        'staff_logged_in' => 1
    );
    $this->session->set_userdata($data);
    redirect('clock/clock');
} else {
    $this->load->view('login/login');
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 2017-02-06
    • 2016-09-05
    • 2021-10-09
    • 1970-01-01
    相关资源
    最近更新 更多