※社内専用

スクラッチフォームでセッションフィクセーション攻撃対策のためにsession_regenerate_id関数を使用

  • HOME
  • トピックス
  • スクラッチフォームでセッションフィクセーション攻撃対策のためにsession_regenerate_id関数を使用
2022/11/09に修正 「追記」の内容をフローから外しました。

SL(シードライセンス)用のスクラッチフォームでセッションフィクセーション攻撃対策のためにsession_regenerate_id関数を使用してほしいと言われたときの対処法です。
あまりないと思いますが備忘録として残します。
根本的な解決にはならないかと思いますが、対策としてすすめてみるのはありだと思います。

手順

①セッションがURLに表示されるのを削除

\contact\view\confirm.php
onclick="location.href='./<?= '?PHPSSID='.session_id(); ?>';">
↓
onclick="location.href='./';">

②session_regenerate_id();を追記

session_start();があるデータを探してその下にsession_regenerate_id();を追記する。
\contact\
confirm.php
index.php
submit.php
※念のため他にもないか確認してください。

③セッションIDが変わっているかの確認用の記述を追記

index.phpのsession_regenerate_id();の下に追記する。
$new_id = session_id();
print('index.php のsession_regenerate_id()は'.$new_id.' です。<br>');

④テスト送信

入力画面→確認画面→修正画面→確認画面→送信完了
とセッションが変わるか確認。③の記述の位置に表示されます。
送信後に下記でセッションがページ切り替えごとに生成されているかを確認(目に見えないだけ)
もしある場合は修正前のものが残っているのかもしれないので削除か作成日時で判断してください。
/contact/private/_session

⑤確認用の記述を削除

③の追記を必ず削除してください。その後納品です。

追記

セッションを目に見えないようにしたほうがいい場合

今回の対応をすることでに_session フォルダに本来より大量に生成されるようになります。
それも気になると言われた場合は下記のようにコメントアウトとセッション名を独自のものに設定で対応してください。
コメントアウトするとセッション名が自然のものになるため、同じサーバー内にスクラッチフォームを複製したものがあった場合、同じセッションに基づいて違うフォームの値がページ表示直後に入力されてしまう可能性が高いです。

1.下記をコメントアウトして_session フォルダに保存されないようにします。
送信後にセッションのファイルが出来ていないことを確認(目に見えないだけ)
もしある場合は修正前のものが残っているのかもしれないので削除か作成日時で判断してください。
\contact\src\session.php
\contact\src\config.php
// session_save_path('private/session/');
2.②と同じ全てのsession_start();の前に下記のように追加。名前は独自のものに変更して構いません。
session_name('contact_1');
3.デベロッパーツールでセッション名が変わっているか確認してください。

補足

・他社サーバー
「他社サーバーの場合は挙動が違うかもしれないので必ずテスト送信にて確認してほしい」と納品時に伝えてください。
これは伝える必要はないですが、セッションの保存先をコメントアウトしたことでどこに保存されるかわからないのでその点影響が出る可能性があります。

・_session フォルダ
今回の内容ではコメントアウトで記述は残しているのですがそれだとまずい場合は記述自体削除して、下記のフォルダも削除してテスト送信で問題ないことを確認してから納品してください。
\contact\private_session

参照

session_regenerate_id関数
https://www.php.net/manual/ja/function.session-regenerate-id.php