PHP - Laravel - CSRF - 後付けでキーを設定

 
1. 概要
2. 後付けでキーを設定

1. 概要

 これ、うまく説明するのが難しいなぁ。  えっと、「form」の、記述内容を含め、数も条件によって変化させているのですね。  関数で生成しています。  「form」自体が「.blade.php」に直接記述しているものではないので、「@csrf」と書くわけにゃいかんのです。  かと言って

<input type="hidden" name="_token" value="...">
 と書いても、「value」に記述するキーが、実際にコンテンツを表示する際に生成されるので、あらかじめ用意しておくことができない。  前ページの手法で、逃げることも考えましたが・・・。  工夫して、何とかすることができました。

2. 後付けでキーを設定

 わたしの場合は、最低ひとつは「form」があったので、なんとかなりましたが、最低の1つがなくても、ダミーの「form」をあらかじめ静的に埋め込んでおきます。  名前を仮に「dummy」としておきましょうか。  「.blade.php」内に

<form name="dummy" action="" method="POST">
@csrf
</form>
 と記述しておきます。  動的に生成する「form」の名称を仮に、「sample」としておきましょうか。  動的に生成する結果が下記のようになるようにします。

<form name="sample" action="" method="POST">
<input type="hidden" name="_token" value="">

・・・	略	・・・

</form>
 「javascript」の関数を書いておきます。

function setCSRF()
{
	var token = document.dummy._token.value;

	document.forms['sample'].elements['_token'].value = token;
}
 後は、「.blade.php」かテンプレートで記述している「body」の個所に

<body onload="setCSRF()">
 と書いておけば、うまく設定されます。  「form」のネーミングルールだけきちんとしておけば、「javascript」の中に行を追加するだけで、なんとかなります。  あ、「dummy」とする「form」が必ず先頭になるようにしておけば、「document.forms」の要素数をうまいことコントロールすることで、うまくいくな。

function setCSRF()
{
	var token = document.dummy._token.value;

	for (let i=0; i<document.forms.length; i++)
	{
		document.forms[i].elements['_token'].value = token;
	}
}
 これで、いいや。