Ethnaで二重POSTを防止するには、templateに{uniqid}を埋め込み、アクションでEthna_Util::isDuplicatePost()を使います。
しかし、これを実施しても、二重POSTがチェックされず素通りしてしまうことがあります。
これは、isDuplicatePost()の動作に起因しています。
isDuplicatePost()は、uniqidで渡された値とIPアドレスを元にファイル名を決定し、tmpディレクトリ以下にそれが存在するかをチェックしています。
該当ファイルが存在しない場合、そのファイルをtmpディレクトリに作成しますが、作成に失敗すると重複POSTチェックは働きません。
tmpディレクトリに書き込めない場合のほか、クライアント側がIPv6の時にもこの現象が生じます。
たとえばWindows環境でlocalhostで動作させる場合、REMOTE_ADDRが127.0.0.1になれば問題ないですが、::1 になってしまったばあい、コロンのつくファイル名は使えないので、作成に失敗します。
これによって、isDuplicatePost()を素通りしてしまう現象が発生します。
とりあえず解決するには、hostsファイルでlocalhostの::1を消して、127.0.0.1だけを指定すればOKですね。
まさかPHPフレームワークでIPv6対応が必要とは・・・