2011-01-26

 

 

執筆中

 

 

C++によるCAPTCHA(画像認証)の実装です。

特徴は、

制限事項

万一プログラムが誤動作した際に、サーバ運営会社や他の利用ユーザに迷惑をかける恐れがあります。自分が管理権を持ったサーバーでのみ実行するなど、慎重に運用してください。このプログラムを使用したことによる結果について、作者は一切の責任を負いません。

インストール

captcha.tar.gz

上の書庫ファイルを展開して、captchaディレクトリに移動し、makeでコンパイルします。

実行に必要なファイルは次の通り。

ファイル名 属性 備考
captcha.cgi 755 CGI本体
captcha.digits.cgi 644 フォント画像
captcha.status.cgi (空のファイル) 666 セッション情報

上記すべてのファイルをバイナリモード(コード変換を行わない)でサーバに転送します。

CGIスクリプトに埋め込む

captcha.cgiをウェブブラウザから引数無しで実行すると、このページの上部に表示されているような「CAPTCHA」の文字が表示されます。もし、Internal Server Errorが表示される場合には、ファイルの属性と、転送モードを確認してください。特にバイナリモードで転送しないと絶対に動作しないので注意してください。

IDを生成する

captcha.cgiをスクリプトから、generate引数を付けて実行すると、id(識別コード)が帰ります。第二引数の数値は桁数を指定します。

Rubyでの例を示します。

captcha_id = `./captcha.cgi generate 3`.chomp

idは20桁のランダムな英数字から成ります。

画像を表示する

captcha.cgiをウェブブラウザからid引数を付けて実行すると、画像が表示されます。

Rubyでのフォームの実装例を示します。

<input type=hidden name=id value="#{captcha_id}">
<img src="captcha.cgi?id=#{captcha_id}"><br>
上に表示されている数字を入力して送信ボタンを押してください<br>
<input type=text name=captcha>

認証を行う

captcha.cgiをスクリプトからfind引数とidを付けて実行すると、数値文字列が帰ります。この文字列と、フォームから入力された文字列を比較して、一致したら認証をパスしたことになります。

  error = ''
if cgi.has_key?('submit') && ENV['REQUEST_METHOD'].upcase == 'POST' captcha_id = cgi['id'] if captcha_id =~ /^[0-9A-Za-z]+$/ accept = false cap = `./captcha.cgi find #{captcha_id}`.chomp if cap != '' && cap == cgi['captcha'] accept = true else error += "画像認証が失敗しました。" end if accept # 更新処理を行う

 

 

 

執筆中

 

WordPressに組み込む

WordPress 3.0.3 に組み込んでみました。プラグインではありません。phpファイルを直接書き換えています。

wp-comments-post.php

86行目付近

  wp_die( __('Error: please type a comment.') );

$cap_str = trim($_POST['captcha']);
$cap_id = trim($_POST['captcha_id']);
if ($cap_id == '' || $cap_str == '' || $cap_str != trim(exec(ABSPATH . 'captcha.cgi find ' . $cap_id))) {
  wp_die( __('Error: CAPTCHA code incorrect.') );
}

$comment_parent = isset($_POST['comment_parent']) ? absint($_POST['comment_parent']) : 0;

wp-includes/comment-template.php

1577行目付近

            <?php echo $args['comment_notes_after']; ?>

<?php $cap_id = exec(ABSPATH . 'captcha.cgi generate 3'); ?>
<p>CAPTCHA(画像認証)</p>
<p><img src=<?php echo site_url('captcha.cgi' . '?id=' . $cap_id); ?>></p>
<p>上の画像に表示されている数字を入力して、送信ボタンを押してください。<br>
</p>
<p class="comment-form-captcha"><input id="captcha" name="captcha" type="text" style="width:5em;" /></p>
<input name="captcha_id" type="hidden" value="<?php echo $cap_id ?>" />

            <p class="form-submit">

 

 

プラグイン化や多言語化を行って頂ける、PHPに詳しくて親切な方、もしいらっしゃったらご連絡ください。

 

 

執筆中