PukiWiki article 用 CAPTCHA プラグイン article_kcaptcha.inc.php

忙しくて更新が滞っています.すいません.一応まだ生きております.



PukiWiki のスパム対策のひとつに,PHP の KCAPTCHA ライブラリを用いて CAPTCHA を実装したシリーズがあります.

PukiWiki サイトで配布されているのは comment,pcomment 用のみ (comment_kcaptcha.inc.php,pcomment_kcaptcha.inc.php) だったので,これらを改造して article 用プラグイン article_kcaptcha.inc.php を作ってみました.



インストール方法は,pcomment_kcaptcha.inc.php のインストール方法 に準じます.5,6 の代わりに以下の article_kcaptcha.inc.php を plugin ディレクトリにアップロードすればおk.

使用の際には,標準の article を article_kcaptcha に置き換えればおkです.



不具合,バグ等ありましたらお知らせ下さい.

<?php
/*
 
 article_kcaptcha.inc.php
 
	KCAPTCHA認証つきarticleプラグイン
 
 Copyright (C)
	2007 nao <nao_at_s164.xrea.com>
 
 Based on pcomment_kcaptcha.inc.php by XLiX
 
 License: GNU GPL 2
 
*/
require_once(PLUGIN_DIR . 'article.inc.php');
 
// 入力が間違っている時のエラー文
define('WRONG_WARNING', '入力文字列が間違っています');
 
// 文字列入力欄の説明
define('CAPTCHA_DESC', '画像の文字列を入力して下さい');
 
// 入力欄の長さ (size)
define('CPT_INPUT_SIZE', 6);
 
// 入力欄の最大入力文字数 (maxlength)
define('CPT_INPUT_MAX', 6);
 
function plugin_article_kcaptcha_action()
{
	global $vars;
	
	if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] ==  $_POST['keystring']){
	} else {
		return array('msg'=>WRONG_WARNING);
	}
	unset($_SESSION['captcha_keystring']);
 
	// article.inc.phpにバトンタッチ
	return plugin_article_action();
}
 
function plugin_article_kcaptcha_convert()
{
	global $script, $vars, $digest;
	global $_btn_article, $_btn_name, $_btn_subject;
	static $numbers = array();
 
	if (PKWK_READONLY) return ''; // Show nothing
 
	if (! isset($numbers[$vars['page']])) $numbers[$vars['page']] = 0;
	$article_no = $numbers[$vars['page']]++;
 
	// kcaptcha
	$kcaptcha_img = "kcaptcha/index.php?".session_name()."=".session_id();
	$desc_str = CAPTCHA_DESC;
	$cpt_input_size = CPT_INPUT_SIZE;
	$cpt_input_max = CPT_INPUT_MAX;
 
	$s_page   = htmlspecialchars($vars['page']);
	$s_digest = htmlspecialchars($digest);
	$name_cols = PLUGIN_ARTICLE_NAME_COLS;
	$subject_cols = PLUGIN_ARTICLE_SUBJECT_COLS;
	$article_rows = PLUGIN_ARTICLE_ROWS;
	$article_cols = PLUGIN_ARTICLE_COLS;
	$string = <<<EOD
<form action="$script" method="post">
 <div>
  <input type="hidden" name="article_no" value="$article_no" />
  <input type="hidden" name="plugin" value="article_kcaptcha" />
  <input type="hidden" name="digest" value="$s_digest" />
  <input type="hidden" name="refer" value="$s_page" />
  <label for="_p_article_name_$article_no">$_btn_name</label>
  <input type="text" name="name" id="_p_article_name_$article_no" size="$name_cols" /><br />
  <label for="_p_article_subject_$article_no">$_btn_subject</label>
  <input type="text" name="subject" id="_p_article_subject_$article_no" size="$subject_cols" /><br />
  <textarea name="msg" rows="$article_rows" cols="$article_cols">\n</textarea><br />
  <img src="$kcaptcha_img" />
  <input type="text" name="keystring" size="$cpt_input_size" maxlength="$cpt_input_max" /> ($desc_str) <input type="submit" name="article" value="$_btn_article" />
 </div>
</form>
EOD;
 
	return $string;
}
 
?>