PHPセキュリティ対策:メールアドレスを画像表示

(1/1)
Web上に公開しているメールアドレスを自動で回収するプログラムがある。これを使って、迷惑メールを送信するためのアドレス帳に登録されてしまう恐れがある。
そうした被害を避けるため、メールアドレスを画像化しておこう。正規ユーザーには迷惑をかけるが、自己防衛のためにやむを得ないことである。

(2026年3月15日)PHP 8.5対応

目次

サンプル・プログラムの実行例

メールアドレスを画像表示

サンプル・プログラム

サンプル・プログラムは、直接、Webページに埋め込まれることも想定している。
たとえば Apache + PHP の環境であれば、
<!--#include virtual="ascii2image.php?s=hogehoge.pahoo.org" -->
のように記述することで、Webページに画像化したテキストを埋め込んでくれる。
圧縮ファイルの内容
ascii2image.phpサンプル・プログラム本体。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「PHPでGET/POSTでフォームから値を受け取る」「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
ascii2image.php 更新履歴
バージョン 更新日 内容
3.1.0 2022/06/27 PHP 8.5対応
3.0.1 2022/06/27 FastCGIで正常動作しない不具合を修正
3.0.0 2022/05/23 pahooInputData.php分離,PHP8対応
2.0.2 2018/12/30 余計なコードを削除
2.0.1 2016/01/09 ヘルプ修正
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加

準備

ascii2image.php

  59: // 各種定数(START) ===========================================================
  60: 
  61: // 表示幅(ピクセル)
  62: define('WIDTH', 600);
  63: 
  64: // テキスト(初期値)
  65: define('DEF_TEXT', 'hoge@pahoo.org');
  66: 
  67: // テキスト(最小長)
  68: define('MIN_LEN_TEXT', 1);
  69: 
  70: // テキスト(最小長)
  71: define('MAX_LEN_TEXT', 30);
  72: 
  73: // テキスト(許容パターン)
  74: define('PAT_TEXT', '/^[\x20-\x7E]+$/');
  75: 
  76: // フォント・ファイルの名称、配置位置
  77: $FontTable = array(
  78:     array('VLゴシック', '../../../../common/font/VL-PGothic-Regular.ttf'),
  79:     array('Throw My Hands Up in the Air', '../../../../common/font/ThrowMyHandsUpintheAir.ttf'),
  80: );
  81: 
  82: // 各種定数(END) ===============================================================

画像処理のために GD関数が利用できるようになっている必要がある。

今回は、描画用フォントとして「VLゴシックフォントファミリ」と「Throw My Hands Up in the Air」の2種類を選択できるようにした。後者は手書き風フォントであり、OCRによる解析を回避する役に立つだろう。
使用するフォントを変更したり増やしたいときは、配列変数 $FontTable を編集して欲しい。

その他、入力バリデーションに必要なパラメータを定数で用意している。これらも自由に変更できる。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。

解説:ASCII文字を画像に変換

ascii2image.php

 143: /**
 144:  * ASCII文字を画像に変換
 145:  * @param   int    $mode 0=画面出力,1=画像出力
 146:  * @param   int    $font 0|1(フォントの種類)
 147:  * @param   string $str  ASCII文字列(UTF-8)
 148:  * @return  string BASE64
 149: */
 150: function ascii2image($mode, $font, $str) {
 151:     global $FontTable;
 152: 
 153:     if ($str == '')     return '';
 154: 
 155:     $res = '';
 156:     $size = 20;
 157:     $arr = imagettfbbox($size, 0, $FontTable[$font][1], $str);  // サイズ取得
 158:     $im  = imagecreate($arr[4- $arr[6+ 5, $arr[1- $arr[7+ 5);
 159:                                                     // イメージストリーム作成
 160:     $bgcolor = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);   // 背景色
 161:     imagecolortransparent($im, $bgcolor);                   // 透明化
 162:     $color = imagecolorallocate($im, 0x00, 0x00, 0xCC); // 文字色
 163:     imagettftext($im, $size, 0, -$arr[6], -$arr[7], $color, $FontTable[$font][1], $str);    // 出力
 164: 
 165:     if ($mode == 1) {
 166:         header("Content-type: image/png");              // MIMEはPNGで
 167:         imagepng($im);                                  // ブラウザ表示
 168:     } else {
 169:         ob_start();
 170:         imagepng($im);                                  // ブラウザ表示
 171:         $res = base64_encode(ob_get_clean());
 172:     }
 173:     // PHP8.5:非推奨関数
 174:     if (PHP_VERSION_ID < 80500) {
 175:         imagedestroy($im);
 176:     }
 177: 
 178:     return $res;
 179: }

入力したASCII文字を画像に変換するユーザー関数が ascii2image である。GD関数を使ったフォント描画については「PHPでTrueTypeフォントを利用する」で紹介したので、そちらを参考にしてほしい。

参考サイト

(この項おわり)
header