全般的に間違った理解と思われる箇所が多いので、セキュリティの勉強を基礎からやり直されたほうがよいかと思います。
イメージとしてはユーザーがformのinputで何か入力するページでトークンを生成し、入力した値をチェックするページやinsertするページにトークンチェックのコードを設置すると考えております。
違います。
CSRFとは、サーバー上で重要な更新処理などがある場合に行います。たとえば退会処理は入力なしでボタンを押すだけでも実現できますが、そのような場合でもCSRF対策は必要です。入力は関係ありません。
つまりcsrf対策はユーザーが入力した値を受け取る処理があるページ(ログインページや問い合わせフォーム)等で設定しておけばいいと思っているのですがあっていますでしょうか?
違います。
まず、ログインページでは必須ではありません。まだログインしていないからです。
問い合わせフォームは必須ですが、それは入力があるからではなく、問い合わせによりメールが飛んだりデータベースの更新により、問い合わせがあったことによるサイト運営者側のアクションが発生するからです。
下記がトークンの生成コードにまります。
前述のようにログイン処理ではトークンのチェックは必須ではありませんが、実施してもいいでしょう。
次にログイン情報をチェックするページにてhiddenで送られて来たトークンとSESSIONのトークンが一致するか検査。
下記がトークンの検査コードです。
これだと、$_POST['token'] と $_SESSION['token'] がともにNULLの場合にチェックをすりぬけますね。以下の記事を参考にしてください。
問題:間違ったCSRF対策~初級編~
解答:間違ったCSRF対策~初級編~
あとは全ページでsession_regenerate_id( true )を記述しています。
全ページでsession_regenerate_idを呼ぶ必要はありません。これが必要なのは、セッション変数に重要な情報をセットするページのみです。login-check.phpはidをセッションに保存するために必要ですが、それ以外は必須ではありません。全ページでこれをやると、スマホユーザなどがレスポンスをとりこぼすとログインが継続できなくなリます。
また、ログインができればSESSIONにログインしたユーザーid(データベース上で一意なもの)を持ち持ちまわってそのユーザーを特定しているのですがidを持ちまわるのは変でしょうか?
変ではありません。通常のやり方です。
持ちまわるのはSESSIONにidが入っているかいないかでページ上部にログインボタンまたはマイページボタンを表示するために持ちまわっています。
この目的だけであれば、idではなく、ログイン中かどうかのフラグ(falseかtrue)でよいのですが、マイページがあるのであればログインユーザの情報(idや、もし登録してあればメールアドレス等)を表示する必要があるような気もしますがいかがですか?
コメントの後半に対して回答します。
スマホユーザなどがレスポンスをとりこぼすとログインが継続できなくなる。
そんなことがあるんですね。
何故そうなるのか理由を探してみます。
考えてもわからなければ、新しい質問いただけたら回答します。
フラグはどのようなものでしょうか?
フラグとは、false/trueあるいは 0/1 のような値(真偽値や二値といいます)をとる変数のことです。
SESSION['flag']のような形でfalseかtrueをセットするということでしょうか?
それでもいいですし、フラグの意味がわかりやすいように、$_SESSION['is_loggedin'] のような形にすることも多いです。
当方は今SESSIONにidを入れて持ち回り、マイページにようこそ○○さん(ユーザーの名前)や登録情報変更 の際inputのvalueに現在登録されている情報を表示するためにidを持ち回っています。
SQLのWHEREでidで検索するためです。
ということは、単に「SESSIONにidが入っているかいないかでページ上部にログインボタンまたはマイページボタンを表示するために持ちまわっています」というわけではないのですね。回答側は質問文のみが頼りですので、正確に書くようにしましょう。
マイページでユーザーに自身のデータベース上のidや登録しているメールアドレスを表示する理由は何でしょうか?
ユーザー自身が確認するためです。あるいは、「マイページにようこそ○○さん(ユーザーの名前)や登録情報変更 の際inputのvalueに現在登録されている情報を表示するためにidを持ち回っています」と書かれたこともほぼ同じですよね。そのことを指しています。