ワンタイムトークン機能(v4.2.7~)
メールフォームプロにクロスサイトリクエストフォージェリ攻撃への対策の一環としてワンタイムトークン機能を実装しました。メールフォームプロは元々クロスサイトリクエストフォージェリ攻撃をしづらい仕組みになっているので、こちらは標準で有効になっておりません。
クロスサイトリクエストフォージェリ攻撃というのがありまして、リンクや偽装サイトなどから攻撃を行う事ができるたぐいの攻撃なのですが、それに対するやや強めの対策としてワンタイムトークン機能というものを実装しました。
仕組み
- フォームにアクセスした際にトークンを発行(Javascript経由で発行する)
- フォーム送信時に発行したトークンが有効かどうかをチェック
- 有効なトークンであれば送信。そうでなければエラー
という単純な仕組みになっております。
仕組み上、迷惑メール対策にもなるので迷惑メールがうるさいぞー!という人がもしおりましたらこちらの機能を有効にしてみてください。
設定方法
ワンタイムトークンをフォーム画面で発行(見えませんが)し、フォーム送信時にそれを照会することでクロスサイトリクエストフォージェリ対策と迷惑メール対策を行うための機能です。
- config.cgiを編集し、push @Modules,'onetimetoken';push @AddOns,’onetimetoken/onetimetoken.js’;を有効にします。
- configs/onetimetoken.cgiを編集しトークンのキーや有効期限などを設定します。
- これで作業は完了です。
コメント欄
設置方法を拝見し、ワンタイムトークン機能を有効にし、フォームページからすぐに送信テストをおこなったのですが、「トークンの有効期限が切れています。<br>The token has expired.」と表示され、送信ができません。
configs/onetimetoken.cgi にてトークンのキーを4桁の番号に変更しました。
考えうる問題点や解消方法をご教示いただけますと幸いです。
よろしくお願いいたします。
/data/onetimetoken/ というフォルダにトークンファイルが生成されていなかった場合、トークンファイルの生成に失敗している可能性があるため、パーミッションをご確認ください。
現在1サイトに、3つのメールフォームプロを入れています。個々ばらばらにフォームから、プログラムまで入れて、動作しています。(まだ未公開ですが)
こちらのワンタイムトークンにおいて、1つ目は送信OKで、2,3つ目のフォームからは、「トークンの有効期限が切れています。<br>The token has expired.」となり、送信できません。トークンのキーはバラバラです。/data/内のフォルダは、パーミッション777としました。
その他のconfig.cgiの中身や、他のパーミッションを調べても同じ条件で、ワンタイムトークン機能を切ると、全部送信できました。
同じサイト上では、複数が動かないのでしょうか?
どうにも解決できなさそうで、申し訳ありませんが、ご指導いただけると幸いです。
何卒、よろしくお願いいたします。