Tech Racho エンジニアの「?」を「!」に。

Ethna_Util::isDuplicatePostが動かない

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対応が必要とは・・・


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。