Ethna/memo

ユーザー登録して使うようなアプリケーションを作成する場合、各ユーザーのパスワードを管理しなければならないという問題が発生します。
パスワードはたとえDBの内容を盗み見られても即座に脅威とならないよう、ハッシュ値で保管しておくべきです。

Ethna環境下でパスワードをハッシュ化(sha256+Salt+ストレッチング)して保存、照合する場合のロジックを示します。

Saltやストレッチングを使わずにハッシュを作成した場合は、それを元に戻せるWebサービスなどにかかれば、一瞬でパスワードが判明してしまうでしょう。

コード例

パスワード登録時は以下のような感じ。

$userid = $this->af->get('userid');
$password = $this->af->get('password'); // form入力されたパスワード平文
$item =& new YourProject_User($this->backend);
$item->set('userid', $userid);
$item->set('password',password_hash($password, PASSWORD_DEFAULT));

if (Ethna::isError($item->add())){
	// DBエラー
	return 'user_password_change';
}

// 登録完了
return 'user_profile';

認証をもとにセッションとアクセス権の制御を行う方法はこちら
認証成功時にセッションに認証済みを記録する場合はこんな感じ。

if ( $this->af->get('userid') == "" ) return 'login';    // useridなしは許さない
if ( $this->af->get('password') == "" ) return 'login';  // passwordなしは許さない
$user = $this->backend->getObject('user', 'userid', $this->af->get('userid'));
if(!$user->isValid())
{
	// ユーザーIDまたはパスワードが違います(本当はユーザーIDが存在しない)
	$this->session->set('user', null);    // たとえログオン中であってもユーザー情報を破棄
	$this->session->destroy();            // セッションを丸ごと破棄する場合はこちら
	return 'login';                       // 'ログイン認証' Viewへ
}

$password = $this->af->get('password'); // form入力されたパスワード平文
$hash = $user->get('password');
if(!password_verify($password, $hash)) // 照合
{
	// ユーザーIDまたはパスワードが違います(本当はパスワードが一致しない)
	$this->session->set('user', null);    // たとえログオン中であってもユーザー情報を破棄
	$this->session->destroy();            // セッションを丸ごと破棄する場合はこちら
	return 'login';                       // 'ログイン認証' Viewへ
}

// 認証成功
$this->session->set('user',$user->getNameObject()); // セッションにユーザー情報を保存する
return 'console';                            // 'コンソール' Viewへ

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-03-07 (月) 20:41:00 (780d)