ワンタイムトークン機能(v4.2.7~)

メールフォームプロにクロスサイトリクエストフォージェリ攻撃への対策の一環としてワンタイムトークン機能を実装しました。メールフォームプロは元々クロスサイトリクエストフォージェリ攻撃をしづらい仕組みになっているので、こちらは標準で有効になっておりません。

クロスサイトリクエストフォージェリ攻撃というのがありまして、リンクや偽装サイトなどから攻撃を行う事ができるたぐいの攻撃なのですが、それに対するやや強めの対策としてワンタイムトークン機能というものを実装しました。

仕組み

  1. フォームにアクセスした際にトークンを発行(Javascript経由で発行する)
  2. フォーム送信時に発行したトークンが有効かどうかをチェック
  3. 有効なトークンであれば送信。そうでなければエラー

という単純な仕組みになっております。

仕組み上、迷惑メール対策にもなるので迷惑メールがうるさいぞー!という人がもしおりましたらこちらの機能を有効にしてみてください。

設定方法

ワンタイムトークンをフォーム画面で発行(見えませんが)し、フォーム送信時にそれを照会することでクロスサイトリクエストフォージェリ対策と迷惑メール対策を行うための機能です。

  1. config.cgiを編集し、push @Modules,'onetimetoken';push @AddOns,’onetimetoken/onetimetoken.js’;を有効にします。
  2. configs/onetimetoken.cgiを編集しトークンのキーや有効期限などを設定します。
  3. これで作業は完了です。

コメント欄

2024-07-18 20:37:12和田さん
複数フォームで利用する場合はMultiConfig機能をご利用いただき、dataディレクトリを分けることで、特段設定なしで別々に動作するようになります。
2024-07-18 15:15:07のとさん
mailformpro4.3.1を使用しています。いつもお世話になっています、ありがとうございます!
複数設置についてご教示ください。

フォームaとフォームbにそれぞれワンタイムトークン機能を実装するため、

・各config_a.cgi、config_b.cgiの
 push @AddOns,’onetimetoken/onetimetoken.js’;
 push @Modules,’onetimetoken’;
 を有効化

・config_a.cgiは初期値、
 config_b.cgiは push @Modules,’onetimetoken2’; に変更

・/mailformpro/configs/onetimetoken.cgi[755]を複製して
 /mailformpro/configs/onetimetoken2.cgi[755] に変更、
 ## トークンを記録するディレクトリ
 $config{"onetimetoken.dir"} = "$config{’data.dir’}onetimetoken2/"; に変更

・/data/onetimetoken/ [777]を複製して
 /data/onetimetoken2/ [777]を設置

・/add-ons/onetimetoken/ 内のonetimetoken.js/onetimetoken.js.cgiは変更しない

上記にしたところ、
フォームaにアクセスした際には/data/onetimetoken/、
フォームbにアクセスした際には/data/onetimetoken2/に
ワンタイムキーのcgiが作成されましたが、
フォームを送信したところ
フォームaの/data/onetimetoken/内のキーは削除されましたが、
フォームbの/data/onetimetoken2/内のキーは削除されませんでした。

設定の足りないところや違っているところはありますでしょうか?ご教示いただけますと幸いです。
2024-03-28 10:17:48和田さん
詳細な構成がわからないのでなんとも言えませんが、複数設置の場合、適切な設定が行われていないとそうなる可能性があります。具体的にはデータフォルダがしっかりフォーム毎に分けられているかどうかです。
2024-03-26 22:03:17ばんのさん
メールフォームプロ4.3.1を使用しています。ありがとうございます。
現在1サイトに、3つのメールフォームプロを入れています。個々ばらばらにフォームから、プログラムまで入れて、動作しています。(まだ未公開ですが)

こちらのワンタイムトークンにおいて、1つ目は送信OKで、2,3つ目のフォームからは、「トークンの有効期限が切れています。<br>The token has expired.」となり、送信できません。トークンのキーはバラバラです。/data/内のフォルダは、パーミッション777としました。

その他のconfig.cgiの中身や、他のパーミッションを調べても同じ条件で、ワンタイムトークン機能を切ると、全部送信できました。
同じサイト上では、複数が動かないのでしょうか?

どうにも解決できなさそうで、申し訳ありませんが、ご指導いただけると幸いです。
何卒、よろしくお願いいたします。
2022-05-18 22:03:24和田さん
/data/フォルダ内の各ディレクトリのパーミッションが777あるいは読み書き可能なパーミッションになっていない可能性があります。
/data/onetimetoken/ というフォルダにトークンファイルが生成されていなかった場合、トークンファイルの生成に失敗している可能性があるため、パーミッションをご確認ください。
2022-05-18 13:38:28山崎さん
メールフォームプロ4.3.1を使用させていただいております。ありがとうございます。
設置方法を拝見し、ワンタイムトークン機能を有効にし、フォームページからすぐに送信テストをおこなったのですが、「トークンの有効期限が切れています。<br>The token has expired.」と表示され、送信ができません。
configs/onetimetoken.cgi にてトークンのキーを4桁の番号に変更しました。

考えうる問題点や解消方法をご教示いただけますと幸いです。
よろしくお願いいたします。