-2

我正在尝试创建新帐户并将每个用户的注册详细信息以加密形式输入我的会员数据库 - 目前可以在数据库中看到实际密码。为什么是这样?我正在使用表单验证库,并且已经包含了密码字段的 md5 规则,但它似乎没有产生任何影响。

控制器:

 function register()
 {

$this->load->helper(array('form', 'url'));

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


$this->form_validation->set_rules('username', 'Username', 'required|callback_usernameTaken|min_length[5]|max_length[12]|trim');
$this->form_validation->set_rules('password', 'Password', 'required|md5|trim');


$username = $this->input->post('username');
$password = $this->input->post('password');


if ( $this->form_validation->run()&& !$this->membership->usernameTaken($username)){

$this->membership->newUser($username, $password);
$this->session->set_userdata('status', 'OK');
$this->session->set_userdata('username', $username);
redirect('home');
 }


else 
   {

    $this->session->set_userdata('status', 'NOT_OK');
    $this->load->view('shared/header');
    $this->load->view('account/signuptitle');
    $this->load->view('account/signupview');
    $this->load->view('shared/footer');

  }

 }

再次感谢您的帮助

模型:

 function newUser($username, $password)
{
    $newMember = array ('username' => $username,
                        'password' => $password);
    $insert = $this->db->insert('membership', $newMember);

}



function usernameTaken($username)
{
    $this->db->select('*')->from ('membership')->where('username', $username);
    $query = $this->db->get();
    if ($query->num_rows > 0)
    {
        echo "<p>";
        echo 'username taken';
        echo "</p>";
        return true;
    }

   else{

    return false;

   }    
}
4

2 回答 2

2

表单验证规则验证表单值,它不会更改它们,因此如果要加密密码,则必须在表单通过验证后/将其添加到数据库之前执行此操作。

除此之外,这md5不是加密密码的好方法,并且它不返回布尔值(truefalse),它返回一个始终评估为的字符串,true因此它在验证函数中没有用。

于 2012-12-29T18:40:18.600 回答
0

您正在分配$username并且$password在运行验证之前。set_rules方法只是设置验证规则。它不运行它。它们在$this->form_validation->run()方法上得到验证。所以只需将这些赋值语句放在if块中。

最好trimset_rules方法中先使用。我把它作为第一条规则。您已经检查callback_usernameTaken了 set_rules 方法,因此无需在 if 语句中再次检查它。usernameTaken在控制器中比在模型中更好。所以把它移到了那里。最后查看我对 usernameTaken 方法所做的更改。我添加了$this->form_validation->set_message方法调用并交换了truefalse.

function register()
{

    $this->load->helper(array('form', 'url'));

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

    $this->form_validation->set_rules('username', 'Username', 'trim|required|callback_usernameTaken|min_length[5]|max_length[12]');
    $this->form_validation->set_rules('password', 'Password', 'trim|required|md5');

    if ( $this->form_validation->run() ){

        $username = $this->input->post('username');
        $password = $this->input->post('password');

        $this->membership->newUser($username, $password);
        $this->session->set_userdata('status', 'OK');
        $this->session->set_userdata('username', $username);
        redirect('home');
    }
    else {

        $this->session->set_userdata('status', 'NOT_OK');
        $this->load->view('shared/header');
        $this->load->view('account/signuptitle');
        $this->load->view('account/signupview');
        $this->load->view('shared/footer');
    }
}

function usernameTaken($username)
{
    $this->db->select('*')->from ('membership')->where('username', $username);
    $query = $this->db->get();
    if ($query->num_rows > 0)
    {
        $this->form_validation->set_message('usernameTaken', 'username taken');
        return false;
    }
    else{
        return true;
   }
}

CodeIgniter 的表单验证类提供表单验证和数据准备功能。http://ellislab.com/codeigniter/user-guide/libraries/form_validation.htmlmd5所以使用inset_rules方法 没有错。它将运行md5方法并返回加密的字符串。

为了更好地加密,请使用Mcrypt扩展名:php.net/manual/en/intro.mcrypt.php 或crypt函数:php.net/manual/en/function.crypt.php。

于 2012-12-29T19:11:52.677 回答