2015年04月21日
ContactForm で送信された値をメール本文に利用する方法
ContactForm で送信された値をメール本文に記述したいというご質問を受ける機会が多々ございますので、その方法について記事にすることにしました。
標準のフォーム投稿通知メールは下記のテンプレートです。
<mt:if name="template_type" eq="mail_admin">新しいフィードバックが '<$mt:var name="form_name"$> (<$mt:BlogName$>)' に投稿されました。<mt:else>以下の内容で <$mt:BlogName$> の <mt:var name="form_name"> への投稿を受け付けました。</mt:else></mt:if>
<mt:if name="template_type" eq="mail_admin"><mt:if name="feedback_status" eq="1">このフィードバックは未読です。<mt:elseif name="feedback_status" eq="2">このフィードバックは確認済です。<mt:else>このフィードバックはフラグ付きです。</mt:else></mt:if>
フィードバックをみる:
<$mt:admincgipath$><$mt:adminscript$>?__mode=view&_type=feedback&id=<$mt:var name="feedback_id" encode_url="1"$>&blog_id=<$mt:BlogID$><mt:else>ポストされたデータ:</mt:else></mt:if>
IP : <$mt:var name="feedback_remote_ip"$>
Email : <$mt:var name="feedback_email"$>
フィードバック:
<mt:if name="field_loop">--------------<mt:loop name="field_loop"><mtif name="field_type" ne="emailcheck">
<$mt:var name="field_label"$>:
<mt:if name="field_type" eq="date"><$mt:var name="field_value" format_ts="1" replace=" 00:00",""$><mt:elseif name="field_type" eq="date-and-time"><$mt:var name="field_value" format_ts="1"$><mt:else><$mt:var name="field_value"$></mt:else></mt:if>
--------------</mt:if></mt:loop></mt:if>
--
Powered by Movable Type
標準のフォーム投稿通知メールでは、MTLoop
タグで field_loop
変数の値をループし、それぞれのフィールドの値を出力するように記述されているため、送信されたすべての値をメール本文に含めることができています。
しかし、
- 一部の値は置換した上で出力したい
- 一部の値はメール本文に出力したくない
- 出力順を任意の順序に変更したい
- フォーム項目としては管理していない
input[type="hidden"]
に入力された値を利用したい
といったニーズに対応しようとすると、field_label
または、field_basename
変数の値を使って、フォーム項目ごとに分岐したり、並び順を変更するために、別の配列変数に格納し直したりと、テンプレートが煩雑になる場合があります。また、フォーム項目として管理していないものは field_loop
変数のループ内で取得することができません。
そのような場合は、下記に説明する MTVar
および、MTGetVar
の特殊な機能を利用することで対応します。
Movable Type および PowerCMS で任意の GET ( または POST ) パラメータの値を取得する方法
Movable Type および、PowerCMS では、テンプレートで任意の GET ( または POST ) パラメータの値を MTVar
または、MTGetVar
タグを使って取得することができます。
主に管理画面で利用するテンプレートで利用するテクニックとなりますが、管理画面以外の動的生成するテンプレートにて利用することができます。
記述方法は下記になります。
例: GET パラメータの foo の値を取り出す
<$MTVar name="request.foo"$>
このテクニックを利用することで、ContactForm で送信されたパラメータをメールテンプレートに記述することも可能となります。
例えば、姓と名を独立したフォーム項目としているが、メール本文では結合して表示したいというケースであれば、下記のように記述ができます。
※ フォーム項目「姓」のベースネームが last_name
で、フォーム項目「名」のベースネームが first_name
であると仮定
お名前: <$MTVar name="request.last_name"$> <$MTVar name="request.first_name"$> 様
この方法を使うことで、送信されたパラメータを任意の順序で、任意に加工してメール本文に記述することが容易になります。
注意事項
今回ご紹介した例は、プレーンテキストなメール本文に記述する内容であることを前提に説明をしておりますが、それ以外のケースで、ユーザーが入力した値(送信されたパラメータ)を、値の妥当性検証や無害化処理をせずに、そのまま画面上に出力するという行為は、脆弱性の発生に即つながります。
例えば、送信された値を HTML に含める場合は、<
や >
、"
など HTML で特別な意味の持つ特殊文字は無害化処理する必要がありますし、JavaScript に含める場合は、HTML で特殊な意味を持つ文字列に加え、\
や NULL 文字など、JavaScript で特別な意味を持つ特殊文字は無害化処理する必要があります。(文脈によってはそれで不十分な場合もあります)
それぞれ、<$MTVar name="request.foo" encode_html="1"$>
や <$MTVar name="request.foo" encode_js="1"$>
などの記述で、適切なエスケープを施さなければなりません。
エスケープするための記述が漏れていたり、記述はされているが、スペルミスがありモディファイアが効いていなかったりした場合は、すぐさまそれが脆弱性となります。
かつ、できれば、<MTIf test="$foo =~ /.../"> ... </MTIf>
(変数 request.foo を変数 foo にコピーしている前提)といった形で、正規表現などを使い、値の妥当性検証をした上で、安全な値であることが検証された場合のみ処理する記述が無難です。
ご利用に際しては上記の注意事項について十分ご注意ください。
- カテゴリー
- 技術情報
コメントを投稿する