-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、パスワードを暗号化するのにあまり良い方法ではなく、ブール値(trueまたはfalse)を返さないので、常に評価される文字列を返すtrueため、検証関数では役に立ちません。

于 2012-12-29T18:40:18.600 に答える
0

検証を実行する前に、割り当て$usernameています。メソッドは、検証のルールを設定するだけです。それは実行されません。それらはメソッドで検証されます。したがって、これらの代入ステートメントをブロック内に配置するだけです。$passwordset_rules$this->form_validation->run()if

trimメソッドで最初に使用することをお勧めしますset_rules。私はそれを最初のルールとして使用しました。すでにcallback_usernameTakenset_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.html したがって、メソッドで使用md5することに問題はありませんset_rules。メソッドを実行md5し、暗号化された文字列を返します。

また、暗号化を改善するには、Mcrypt拡張子:php.net/manual/en/intro.mcrypt.phpまたはcrypt関数:php.net/manual/en/function.crypt.phpを使用します。

于 2012-12-29T19:11:52.677 に答える