Blog スタッフブログ

PHP システム開発

[PHP]csrf対策

システム開発担当のTFです。

やり方

  • csrfトークンを作成し、sessionに保存する
  • 作成したcsrfトークンをフォームにセットする
  • フォームの飛び先で、sessionとフォームにセットしたcsrfトークンの一致するかを判定をする

サンプル

<?php
	// sessionの開始
	session_start();
	
	// csrfトークンの作成
	$csrf_token = bin2hex(random_bytes(32));
	
	// sessionへの保存
	$_SESSION['csrf_token'] = $csrf_token;
?>

<!-- フォーム外省略 -->

<form method="POST" action="./form_send.php">
	<!-- フォームにcsrfトークンのセット -->
	<input type="hidden" name="csrf_token" value="<?= $csrf_token ?>" >
	
	<!-- 必要なinput等 -->
</form>

<!-- フォーム外省略 -->
<?php
	// sessionの開始
	session_start();
	
	// csrfトークンの一致判定
	if( !isset($_POST['csrf_token']) || ( $_POST['csrf_token'] != $_SESSION['csrf_token'] ) ){
		// csrfトークン エラー処理
		exit;
	}
	
	// csrfトークン OK
	
	// 何等かの処理
	
	// sessionのcsrfの削除
	unset( $_SESSION['csrf_token'] );

?>