function setToken($formName) { // トークンを生成 $csrf_token = bin2hex(random_bytes(32)); // $_SESSION['csrf_token']が配列であることを確認 if (!isset($_SESSION['csrf_token']) || !is_array($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = array(); } $_SESSION['csrf_token'][$formName] = $csrf_token; return $csrf_token; }
<input type="hidden" name="form_name" value="entry-form"> <input type="hidden" name="csrf_token" value="<?php echo h(setToken('entry-form')); ?>">
session_start(); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $formName = $_POST['form_name']; if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token'][$formName]) { exit('不正なリクエスト'); } unset($_SESSION['csrf_token'][$formName]); unset($_POST['form_name']); }