こしあん日記 ~写真と猫とサッカーと~

子供たちの記録用にはじめたが、思春期になり写真を撮らせてもらえなくなる。写真と愛猫とサッカーが中心のブログです。

COOKIE認証

日々勉強で覚えることだらけのプログラム。

全部は備忘録に残せないが、大切なものは残しておこう。SQL関連ももう少し書きたいけど、今日やったところから忘れないうちに。

 

誰かの役に立てば幸い。

 

WEBシステムでもアプリっぽい動きを求められることが多い。今作っているシステムもまさにそういったもの。

そこで利用するのがCOOKIE認証。

 

これまでの認証の仕組みで多かったのがSESSION認証。こちらは、ID、パスワードなどの照合を行い、必要な情報をスーパーグローバル変数の$_SESSIONに登録しておき使いまわす方法。

サーバ側で保持する情報のため、一定時間アクションがないと自動解放してしまう。一定時間とはphp.iniで設定されている。

 

COOKIE認証はSESSIONとは違いローカル側で保持する情報になる。

また保持時間も都度自由に設定できるというメリットもある。

サーバ側に持たさないので、負荷が分散化できる。

 

やり方は簡単。

setcookie("クッキー名","値","保持時間");

でクッキーを食わせることができる。

後は食わせた値を使っていろいろできる。

 

と簡単そうだが、重要なこともある。

クッキーはローカル側で持つ情報なため、情報が筒抜けになる。例えば

setcookie("smple_system", $password, strtotime( '+10 year' ));

と書いたとする。値の$passwordはログイン時のパスワードが入るとすると、ブラウザの開発ツールで見れば、パスワードが表示されてしまうというセキュリティとしてはお粗末なものになってしまう。

 

そこで

1.2つ以上の値を設定する。

2.暗号化する。

 

暗号化は可逆性、つまり元の状態に戻せるものを使う。今回はBASE64を選択。

不可逆なハッシュの方がセキュリティは高いが、2つ以上の値を設定しハッシュ化すると、値の再利用が難しくなるので。

 

//ユーザーIDとログインIDをコロンでつなげた文字列をセット

$auth_code = $user_id . ":" . $login_id;

 

//BASE64で暗号化

$auth_crypt = base64_encode($auth_code);

 

//sample_systemというCOOKIEに値をセットし10年間保持

setcookie("sample_system", $auth_crypt, strtotime( '+10 year' ), "/");

 

これで、比較的安全にクッキーを食べることになる。

 

しかし、ログイン画面からログイン処理を行ったときはこの方法でいいが、はじめからクッキーを食べさせて、例えばユーザー登録なしで「いいね」を保持する場合は、これではだめ。

 

上記のような処理を行いたい場合は、トップページにクッキーを食べさせる仕組みが必要になる。

 

//クッキーを食べているか確認し、食べていない場合ユーザー仮登録

if (!isset($_COOKIE["sample_system"])){

 

//ランダムな値の仮ID、パスワード発行
$login_id = uniqid("PREUSER_");
$password = uniqid("PREPASS_");


//USERテーブルへ登録(stateが0を仮登録者とする)
$stmt = $mysqli -> prepare("INSERT INTO user(login_id, state) VALUES(?, ?, 0)");
$stmt->bind_param('ss', $login_id, $password);
$stmt->execute();
$user_id = $mysqli->insert_id; //挿入したレコードのuser_idを取得
$stmt->close();

//クッキーの値作成
$auth_code = $user_id . ":" . $login_id;
$auth_crypt = base64_encode($auth_code);

setcookie("sample_system", $auth_crypt, strtotime( '+10 year' ), "/");
header("Location: index.php");

 

これでユーザーを仮登録し、クッキーを食べさせることができる。

ログイン時は、クッキー情報を一度解放し、値の再取得をするだけ。

だた、クッキーはクローラーBOTなども食べ、都度仮ユーザーを作られてしまう。なので、クローラー対策は必要となる。それはまたいずれ。