PHP によるセッション管理 忘備録
CSRF対策についてはこちら IPA ISEC セキュア・プログラミング講座:Webアプリケーション編 第4章 セッション対策:リクエスト強要(CSRF)対策
サーバー側でセッションを持っていれば安全。
ポイント
サーバー側でセッションを作成、任意の乱数を発生させる
HTML側 ユーザーに表示される form タグの間に hidden 項目で inputタグを入れる
サーバー側で、セッションが同じであれば、通常の処理をし、セッションが違えば、処理を終了する。
サーバー側でセッションを作成、任意の乱数を発生させる
//セッションを作成する。 自動的にスパーグローバルの $_SESSION に格納する
session_start();
function setToken() {
//token を取得 tokenとはサーバーで管理する、一定期間有効なパスワードのようなイメージ
//変数tokenには、ランダムな数字を発生させて、更にそれに追加して(true),それを一意なIDを生成し、それでもってハッシュ計算をして詰め込ん//でねという意味
$token = sha1(uniqid(mt_rand(), true));
//sh1はsh1ハッシュを計算する
//uniqid は一意なIDを生成する 暗号学的に安全ではない。そのために引数内で mt_rand を利用している 第二引数にtrueを指定すると
戻り値の最後に更に別の不確定な数字を足してくれる。これによりセキュアになる。
//mt_rand()は乱数を発生する
//それをセッション変数に持ちましょう
$_SESSION['token'] = $token;
}
//tokenをチェックする関数
function checkToken() {
//セッションがなかったり、サーバーで持っているセッション変数とユーザーから送られてきたpostのセッションが違っていたら
//処理をやめる。 その人は悪い人ということ
if (empty($_SESSION['token']) || ($_SESSION['token'] != $_POST['token'])) {
echo "不正なPOSTが行われました!";
exit;
}
}
HTML側 ユーザーに表示される form タグの間に hidden 項目で inputタグを入れる
//これはformタグの中にあれば良い。submitの前に持ってくる必要はない。 <input type="hidden" name="token" value="<?php echo h($_SESSION['token']); ?>">
サーバー側で、セッションが同じであれば、通常の処理をし、セッションが違えば、処理を終了する。
先程の関数を入力の処理の中でチェックしてから、処理を記載する。
if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['message']) && isset($_POST['user'])) { //こんな感じで呼び出してあげる。 checkToken();
- 参考サイト
ドットインストールはとてもいい、プログラム勉強サイト この内容で月額980円はすばらしい!