TransmitMail は v1 も v2 も、 CSRF の脆弱性を突いてメール送信することはいろいろな条件が揃わないと難しい、といった状態であったことと、 CSRF の脆弱性を突いてもメールが送信されるだけで、 CSRF の脆弱性を突かれてメールが送信されることは気持ち悪くはありますが、設置されている TransmitMail の正式な手順を踏んでいたずらメールを送ることは当然できるので、 CSRF の脆弱性自体をあまり深刻に考えてこなかったのですが、だからと言って CSRF の脆弱性があることは好ましい状態ではないので、新しくリリースした v2.2.0 で CSRF の脆弱性への対応を追加しました。

v2.1.1 ( v2.1 の最新バージョン)から v2.2.0 へのアップグレード手順は下記の通りです。

lib/TransmitMail.php を差し替える

lib/TransmitMail.php を直接編集してカスタマイズしていない場合は、 GitHub から最新版をダウンロードして lib/TransmitMail.php を差し替えてください。

lib/TransmitMail.php を直接編集してカスタマイズしている場合は、差分を確認して変更内容を適用してください。

input.html に CSRF トークンを追加する

input.html の form 内に下記の CSRF トークンを追加してください。(追加する位置は input.html の 33 行目あたりもご確認ください。)

<input type="hidden" name="csrf_token" value="{$csrf_token}">

チェックモードでバージョンを確認する

チェックモードで TransmitMail のバージョンが v2.2.0 になっていることを確認してください。

入力確認画面と完了画面の動作確認をする

必ず入力確認画面と完了画面に問題なく遷移できるか、確認をしてください。

入力確認画面や完了画面に遷移できない場合は GitHub の issues 、またはこの投稿にコメントいただければと思います。(その際はレンタルサーバーの場合はレンタルサーバー会社名とプラン名、 PHP のバージョンなど、正常に動作しなかった環境をあわせてコメントください。)

その他

CSRF 対策機能を無効化する

v2.2.0 から CSRF 対策機能は初期状態で有効になっていますが、設定ファイルで無効にできます。設定ファイルが YAML の場合は下記のように記述します。

config:
    csrf: false

CSRF 対策機能がうまく動作しない場合や、 TransmitMail を古いバージョンからのアップグレードする際にアップグレード方法がよくわからない場合は、 CSRF 対策機能を無効化してみてください。

CSRF 対策機能を利用しない場合は input.html に CSRF トークンは不要です。

セッションによる多重送信防止機能を無効にしている場合

CSRF 対策機能はセッションを利用しているため、「セッションによる多重送信防止機能」を無効にしている場合、 CSRF 対策機能を利用することができません。

例えば WordPress に TransmitMail を組み込む場合には、現行のバージョンでは「セッションによる多重送信防止機能」を無効にする必要がありますので、 WordPress + TransmitMail な環境では CSRF 防止機能を利用することができません。

参考: TransmitMail を WordPress で使う場合の設置方法

この件に関しては、近日中に対応を考えたいと思っています。

2019年1月10日 追記: WordPress + TransmitMail でセッションによる多重送信防止機能を使えるように、右記記事のコードを一部書き直しました。 TransmitMail を WordPress で使う場合の設置方法


以上、 TransmitMail v2 の CSRF 対策の紹介でした。

このあと(もしくは近日中に) GitHub の Wiki ページに CSRF 対策機能についての情報を追記しておきます。(書きました。 → https://github.com/dounokouno/TransmitMail/wiki/テンプレートの記述方法#csrf-トークン