Smarty の {mailto}関数を用いたスパム対策

SHOEISHA の「Smarty入門」(山田祥寛) という本に紹介されていた内容を試してみて、Smarty 環境以外のページでどのように使うかについて模索してみます。
つかこの本、とっつきやすくて結構よい感じでした。

メールアドレスのエンコード

まずは、{mailto}を実行してみます。今回は、hex エンコードのみで。

mailto.php

<?php
require_once("Smarty/libs/Smarty.class.php");

$o_smarty = new Smarty();
$o_smarty->template_dir = ".";
$o_smarty->compile_dir = ".";
$o_smarty->config_dir = ".";

$o_smarty->assign('email', 'someone@mailaddres.ne.jp');
$o_smarty->display("mailto.tpl");
?>


mailto.tpl

{mailto address=$email encode="hex"}


で、これが表示されたページのソースをブラウザ越しに見たもの (適当に改行した)

  <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;%73%6f%6d%65%6f%6e%65@%6d%61%69%6c%61%64%64%72%65%73.%6e%65.%6a%70"
  >&#x73;&#x6f;&#x6d;&#x65;&#x6f;&#x6e;&#x65;&#x40;&#x6d;&#x61;&#x69;
  &#x6c;&#x61;&#x64;&#x64;&#x72;&#x65;&#x73;&#x2e;&#x6e;&#x65;&#x2e;&#x6a;&#x70;</a> 

出力結果をみると納得、って感じ。確かに hex エンコードされてる。
本当にエンコードされているか疑わしい人は、上記文字列を切り取り、適当なファイルに貼り付けてブラウザで表示してみるとよいでしょう。


使い方

一度 Smarty で処理した自分のメールアドレスを html ページに配置すれば、一応のメールアドレスの読みとり対策ができたことになります。

が、ページがコンパイルされて生成される場合は、生成されたページに対して、毎回この変更を手動で行うのは面倒です。
という訳で、スクリプトで処理させます。方針としては、スクリプト処理が必要なファイルにのみ処理を行う、という感じです。まず、メールアドレスが存在するかもしれないファイルの検索には、以下のようなスクリプトを用いました。

  find | xargs grep "your@mailaddress" 


で、コンパイル前ファイルが以下のようなものとすると、

  \author Satofumi KAMIMURA <someone@mailaddress.ac.jp> 

コンパイルしたものは以下のようになりました。

  <dl compact><dt><b>Author:</b></dt><dd>Satofumi KAMIMURA
  &lt;<a href="mailto:someone@mailaddress.ac.jp">someone@mailaddress.ac.jp</a>&gt; </dd></dl> 

従って、決め打ちのスクリプトで処理すればよいでしょう。

と、言うわけで、html ページのコンパイル後に以下の処理を行うように Makefile を変更しました。sed, Makefile を使うので、処理文字列の &, # の前に \ を付加してあります。(多分、他人が私にこんな汚いコードを見せてきたら、お説教ものです)
MAIL_INCLUDED_FILE = `find | xargs grep -l "your@mailaddress"` としてもよいでしょう。(ただ、このスクリプトはオリジナルファイルに対して変更を行うので、人が判断したファイル以外を対象にしない方が無難です)

MAIL_INCLUDED_FILE = index.php beego.php
REPLACE_FROM = "mailto:someone@mailaddress.ac.jp">someone@mailaddress.ac.jp
REPLACE_TO = "\&\#109;\&\#97;\&\#105;\&\#108;\&\#116;\&\#111;\&\#58;%73%6f%6d%65%6f%6e%65@%6d%61%69%6c%61%64%64%72%65%73.%6e%65.%6a%70"(以下略)

mail :
        for i in ${MAIL_INCLUDED_FILE} ; \
        do \
            cat $$i | sed -e '/${REPLACE_FROM}/s//${REPLACE_TO}/' > /tmp/tmp.php; \
            mv /tmp/tmp.php $$i; \
        done 

以上


Generated on Mon Apr 13 22:52:06 2009 by  doxygen 1.5.7.1