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 が通ったディレクトリに配置すること。

準備

0046: //表示幅(ピクセル)
0047: define('WIDTH', 600);
0048: 
0049: //テキスト(初期値)
0050: define('DEF_TEXT', 'hoge@pahoo.org');
0051: 
0052: //テキスト(最小長)
0053: define('MIN_LEN_TEXT', 1);
0054: 
0055: //テキスト(最小長)
0056: define('MAX_LEN_TEXT', 30);
0057: 
0058: //テキスト(許容パターン)
0059: define('PAT_TEXT', '/^[\x20-\x7E]+$/');
0060: 
0061: //フォント・ファイルの名称、配置位置
0062: $FontTable = array(
0063:     array('VLゴシック', '../../../../common/font/VL-PGothic-Regular.ttf'),
0064:     array('Throw My Hands Up in the Air', '../../../../common/font/ThrowMyHandsUpintheAir.ttf'),
0065: );
0066: 
0067: /**

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

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

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

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

0126: /**
0127:  * ASCII文字を画像に変換
0128:  * @param   int    $mode 0=画面出力,1=画像出力
0129:  * @param   int    $font 0|1(フォントの種類)
0130:  * @param   string $str  ASCII文字列(UTF-8)
0131:  * @return  string BASE64
0132: */
0133: function ascii2image($mode$font$str) {
0134:     global $FontTable;
0135: 
0136:     if ($str == '')        return '';
0137: 
0138:     $res = '';
0139:     $size = 20;
0140:     $arr = imagettfbbox($size, 0, $FontTable[$font][1]$str);   //サイズ取得
0141:     $im  = imagecreate($arr[4] - $arr[6] + 5, $arr[1] - $arr[7] + 5);
0142:                                                     //イメージストリーム作成
0143:     $bgcolor = imagecolorallocate($im0xFF0xFF0xFF);    // 背景色
0144:     imagecolortransparent($im$bgcolor);                    //透明化
0145:     $color = imagecolorallocate($im0x000x000xCC);  // 文字色
0146:     imagettftext($im$size, 0, -$arr[6], -$arr[7]$color$FontTable[$font][1]$str);   //出力
0147: 
0148:     if ($mode == 1) {
0149:         header("Content-type: image/png");              //MIMEPNG
0150:         imagepng($im);                                   //ブラウザ表示
0151:     } else {
0152:         ob_start();
0153:         imagepng($im);                                   //ブラウザ表示
0154:         $res = base64_encode(ob_get_clean());
0155:     }
0156:     imagedestroy($im);                               //後処理
0157: 
0158:     return $res;
0159: }

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

参考サイト

(この項おわり)
header