2015年04月21日
ContactForm で送信された値をメール本文に利用する方法
ContactForm で送信された値をメール本文に記述したいというご質問を受ける機会が多々ございますので、その方法について記事にすることにしました。
標準のフォーム投稿通知メールは下記のテンプレートです。
<MTIf name="template_type" eq="mail_admin">新しいフィードバックが '<$MTvar name="form_name"$> (<$MTBlogName$>)' に投稿されました。<MTelse>以下の内容で <$MTBlogName$> の <MTvar name="form_name"> への投稿を受け付けました。</MTelse></MTIf> <MTIf name="template_type" eq="mail_admin"><MTIf name="feedback_status" eq="1">このフィードバックは未読です。<MTelseif name="feedback_status" eq="2">このフィードバックは確認済です。<MTelse>このフィードバックはフラグ付きです。</MTelse></MTIf> フィードバックをみる: <$MTadmincgipath$><$MTadminscript$>?__mode=view&_type=feedback&id=<$MTvar name="feedback_id" encode_url="1"$>&blog_id=<$MTBlogID$><MTelse>ポストされたデータ:</MTelse></MTIf> IP : <$MTvar name="feedback_remote_ip"$> Email : <$MTvar name="feedback_email"$> フィードバック: <MTIf name="field_loop">--------------<MTloop name="field_loop"><MTIf name="field_type" ne="emailcheck"> <$MTvar name="field_label"$>: <MTIf name="field_type" eq="date"><$MTvar name="field_value" format_ts="1" replace=" 00:00",""$><MTelseif name="field_type" eq="date-and-time"><$MTvar name="field_value" format_ts="1"$><MTelse><$MTvar name="field_value"$></MTelse></MTIf> --------------</MTIf></MTloop></MTIf> -- Powered by PowerCMS
標準のフォーム投稿通知メールでは、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"$>
このテクニックを利用することで、フォーム項目として管理していない input 要素のパラメータをメールテンプレートに記述することが可能となります。
注意事項
今回ご紹介した例は、プレーンテキストなメール本文に記述する内容であることを前提に説明をしておりますが、それ以外のケースで、ユーザーが入力した値(送信されたパラメータ)を、値の妥当性検証や無害化処理をせずに、そのまま画面上に出力するという行為は、脆弱性の発生に即つながります。
例えば、送信された値を 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 にコピーしている前提)といった形で、正規表現などを使い、値の妥当性検証をした上で、安全な値であることが検証された場合のみ処理する記述が無難です。
ご利用に際しては上記の注意事項について十分ご注意ください。
- カテゴリー
- 技術情報
コメントを投稿する