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

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

(2022年6月27日)FastCGIで正常動作しない不具合を修正
(2022年5月22日)pahooInputData.php分離,PHP8対応

目次

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

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

サンプル・プログラム

サンプル・プログラムは、直接、Webページに埋め込まれることも想定している。
たとえば Apache + PHP の環境であれば、
<!--#include virtual="ascii2image.php?s=hogehoge.pahoo.org" -->
のように記述することで、Webページに画像化したテキストを埋め込んでくれる。
圧縮ファイルの内容
ascii2image.phpサンプル・プログラム本体。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「PHPでGET/POSTでフォームから値を受け取る」「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。

準備

  46: //表示幅(ピクセル)
  47: define('WIDTH', 600);
  48: 
  49: //テキスト(初期値)
  50: define('DEF_TEXT', 'hoge@pahoo.org');
  51: 
  52: //テキスト(最小長)
  53: define('MIN_LEN_TEXT', 1);
  54: 
  55: //テキスト(最小長)
  56: define('MAX_LEN_TEXT', 30);
  57: 
  58: //テキスト(許容パターン)
  59: define('PAT_TEXT', '/^[\x20-\x7E]+$/');
  60: 
  61: //フォント・ファイルの名称、配置位置
  62: $FontTable = array(
  63:     array('VLゴシック', '../../../../common/font/VL-PGothic-Regular.ttf'),
  64:     array('Throw My Hands Up in the Air', '../../../../common/font/ThrowMyHandsUpintheAir.ttf'),
  65: );
  66: 
  67: /**

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

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

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

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

 126: /**
 127:  * ASCII文字を画像に変換
 128:  * @param   int    $mode 0=画面出力,1=画像出力
 129:  * @param   int    $font 0|1(フォントの種類)
 130:  * @param   string $str  ASCII文字列(UTF-8)
 131:  * @return  string BASE64
 132: */
 133: function ascii2image($mode, $font, $str) {
 134:     global $FontTable;
 135: 
 136:     if ($str == '')     return '';
 137: 
 138:     $res = '';
 139:     $size = 20;
 140:     $arr = imagettfbbox($size, 0, $FontTable[$font][1], $str);  //サイズ取得
 141:     $im  = imagecreate($arr[4- $arr[6+ 5, $arr[1- $arr[7+ 5);
 142:                                                     //イメージストリーム作成
 143:     $bgcolor = imagecolorallocate($im, 0xFF, 0xFF, 0xFF);   // 背景色
 144:     imagecolortransparent($im, $bgcolor);                   //透明化
 145:     $color = imagecolorallocate($im, 0x00, 0x00, 0xCC); // 文字色
 146:     imagettftext($im, $size, 0, -$arr[6], -$arr[7], $color, $FontTable[$font][1], $str);    //出力
 147: 
 148:     if ($mode == 1) {
 149:         header("Content-type: image/png");              //MIMEはPNGで
 150:         imagepng($im);                                  //ブラウザ表示
 151:     } else {
 152:         ob_start();
 153:         imagepng($im);                                  //ブラウザ表示
 154:         $res = base64_encode(ob_get_clean());
 155:     }
 156:     imagedestroy($im);                              //後処理
 157: 
 158:     return $res;
 159: }

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

参考サイト

(この項おわり)
header