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円はすばらしい!

https://dotinstall.com/lessons/bbs_php_v2