mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

CentOS – 画像認証「Text_CAPTCHA」使用方法!

[ webサイト ] [ CentOS, PHP, スパム対策 ]

こんばんは。

今回はWindowsで試してみた時と同じように、「Text_CAPTCHA」の使用に挑戦してみました。

↓Windowsでのインストール・使用はこちら↓

↓CentOSへのインストールはこちら↓

作業記録

【前提条件】

  • OSはCentOS5.5
  • WebサーバはApache2.2
  • PHPは5.1.6

1.作業用ディレクトリの作成

Webサーバのドキュメントルートに「Text_CAPTCHA」用の作業ディレクトリを作成します。 当方は以下のようにしました。

1
2
3
4
5
6
7
ドキュメントルート
  |
  +captcha(Text_CAPTCHA用ディレクトリ)
    |
    +fonts(使用するフォントファイルを格納するディレクトリ)
    |
    +img (作成された画像ファイルを格納するディレクトリ)

2.フォントの準備

画像認証に使用するフォントを先ほど作成した「fonts」ディレクトリに配置します。 フォントは自分の気に入ったものをネットで探してもよいし、Windowsのフォントフォルダにあるものを使用してもよいです。 当方は、オーソドックスにWindowsのフォントフォルダの「COUR.TTF」をサーバにコピーして使用します。

3.PHPソース作成

ネットで調べると非常に色々とサンプルがあります。 適当なものを用意します。 当方は以下のようにしました。 (ファイル名は [適当].php)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php

session_start();

//画像のパス
$img_dir   = "captcha/img/";    // ← 画像を格納するディレクトリを指定
$file_path = $img_dir.md5(session_id()).".png";

//POST送信があれば認証
if($_SERVER['REQUEST_METHOD'] == "POST")
{
    if($_POST['input_captcha_auth'] == $_SESSION['captcha_auth'])
    {
        //OK時の処理を記入
        $status = TRUE;
    }else{
        //NG時の処理を記入
        $status = FALSE;
    }

    if(is_file($file_path))
    {
        unlink($file_path);
    }

}else{

    //CAPTCHA
    require_once "Text/CAPTCHA.php";

    $optins = array(
        'width'        => 150,  // ← 表示する画像の横幅を指定
        'height'       => 60,   // ←   〃    高さを指定
        'output'       => 'png',
        'imageOptions' => array(
            'font_size'        => 20 ,
            'font_path'        => 'captcha/fonts/', // ← フォントのあるディレクトリを指定
            'font_file'        => 'COUR.ttf',       // ← フォントファイル名を指定
            'text_color'       => "#FFFFFF",        // ← 画像に表示される文字の色を指定
            'lines_color'      => "#000000",        // ←   〃     ラインの色を指定
            'background_color' => "#666666")        // ← 画像の背景色を指定
    );

    $captcha = Text_CAPTCHA::factory('Image');
    $captcha->init($optins);
    //画像を生成
    file_put_contents($file_path,
    $captcha->getCAPTCHAAsPNG());
    //画像文字列をセッションに格納
    $_SESSION['captcha_auth'] = $captcha->getPhrase();
}

//画像の掃除(POST未送信の画像)
$dir =  opendir($img_dir);

    while(($file_list = readdir($dir)))
    {
        $file = $img_dir .$file_list;

            if(is_file($file))
            {
                if(filemtime($file) < time()-3600)
                {
                    unlink($file);
                }
            }
    }
?>
<!DOCTYPE HTML>
<html>
<meta charset=Shift-JIS>
<title>CAPTCHA TEST</title>
<?php
if(is_file($file_path))
{
    print("<img src=\"".$file_path."\">\n"
         ."<form method=\"post\" action=\"\">\n"
         ."<p><input type=\"text\" name=\"input_captcha_auth\"></p>\n"
         ."<p><input type=\"submit\" name=\"button\" value=\"送信\" /></p>"
         ."</form>\n");
}
?>
</html>

4.確認

前述のphpファイルをWebサーバのドキュメントルートに配置して表示させます。 うまくいけば以下のような画面が表示されるはずですが、なぜか画像が表示されません。 Apacheのエラーログを見てみると、以下のようなものが。。。

1
PHP Warning:  file_put_contents(captcha/img/14b3db5a9b86c8f0373e5d9b2c84760c.png) [[function.file-put-contents](function.file-put-contents "function.file-put-contents")]: failed to open stream: Permission denied in /var/www/html/sample031.php on line 48

パーミッションがおかしくて画像が書き込めない? パーミッションを777にしたら、このエラーは解決。 すると次は、こんなエラー。

1
PHP Warning:  file_put_contents() [[function.file-put-contents](function.file-put-contents "function.file-put-contents")]: The 2nd parameter should be either a string or an array in /var/www/html/sample031.php on line 48

関数「file-put-contents」の第2引数は文字列か配列でないといけない? Windowsでは動いていたコードがなぜ? この第2引数がどうなっているのか少し調べてみたら、確かにWindows側とCentOS側で内容がまったく違う。 どこをどう見てもわからないし、ネット調べてもよくわからない。 おそらく環境が異なるから、なのだが・・・

ということで、CentOSで「Text_CAPTCHA」は諦めました。

5.別のCAPTCHAを導入

Pearを使わず、PHPだけで動作するCAPTHCAにしました。 こちら → Visual and Audio CAPTCHA(通称、PhpCaptcha) 導入方法は「Text_CAPTCHA」よりも簡単でした。 ↓こちらを参照してください↓ PHPプロ!TIPS+ 出来上がった画像はこんな感じ。

PHP_CAPTCHA_1

設定方法にもよると思いますが「Text_CAPTCHA」より綺麗な気がします。

ということで、この「PhpCaptcha」をうちのサーバ(Webサイトのお問合せ)に導入することにします。


今日の作業は以上です。

ではまた。

Comments