分享

WordPress的验证码插件(扩展) - 彩风音乐游戏社区

 沙漠之子 2008-01-10

我的Blog, 时不时就能收到外国人发来的各种垃圾广告...

虽然blog系统有屏蔽垃圾评论的功能, 但是很有局限性...

所以这令我, 很是郁闷...(-_-b)

一直就想着要做一个插件, 来防止任何外国人去评论...
(我也没有什么外国朋友, 有的话, 想要交流直接在qq上就好...)
当然, 只有"中文"能办到...

今天搜索, 发现了http://www./blog/?p=194 , 这上面的一个WP插件, 看了下代码, 超简单, 适合我等新手修改...
PS: 此修改未经原作者同意, 在此我深表抱歉...


1. 图片生成.php(UTF-8)
PHP 代码:
<?php
#
# ImgCode  -  用于评论的图像验证码
#
# Copyright (c) 2005 dualface
# <http://www./>
# Update By ETiV
#
/**
 * 显示验证码
 *
 * @copyright Copyright (c) 2004 
 * @author 廖宇雷 <daut@>
 * @package register
 * @version $Id$
 */
 
//初始化想要输出的字符(英文+数字), 及其长度(一共4个字符, 加上一个中文就足以屏蔽外国人了)
$string '';
$string_len 3;
 
//输出的英文+数字从下面的字符串中取材.
$stuff 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
 
//计算长度, 要减去1. 因为要用substr.
$stuff_len strlen($stuff) - 1;
 
//循环建立起想要输出的非中文内容
for ($i 0$i $string_len$i++) {
 
$string .= substr($stuffrand(0$stuff_len), 1);
}
 
//这里就要开始建立汉字内容了, 下面引号里的内容随便写..基本上不太怪异的汉字就行...
$hanzi '写几个汉字在里面';
 
//这里就要用到mb_strlen函数了, 因为汉字是"Multi-Byte, 多字节"字符. 获取到的汉字符串长度, 同样要减去1.
$hanzi_len mb_strlen($hanzi'utf-8') - 1;
 
//抽取一个汉字.
$single_hanzi mb_substr($hanzirand(0$hanzi_len), 1'utf-8');
 
// 把随机数存入 session
@session_start();
 
//SESSION['IMGCODE'] = 非中文字符串.中文字符串
$_SESSION['IMGCODE'] = $string.$single_hanzi;
 
$_SESSION['IMGCODE_EXPIRED'] = time() + 15 60// 15分钟后该验证码失效
 
 
// 生成验证码图片
$img_width 90;
$img_height 32;
 
$img imagecreate($img_width$img_height);
 
imagecolorallocate($img0x660x660x66);
 
$white imagecolorallocate($img0xff0xff0xff);
 
$ix 5;
$iy 2;
 
$fontid imageloadfont(dirname(__FILE__) . DIRECTORY_SEPARATOR 'sketchey.gdf');
imagestring($img$fontid$ix$iy$string$white);
//以上是原代码, 我就不做注释了.
 
//继续...
//设定字体路径, 然后取一个字体."微软雅黑.ttf"
putenv('GDFONTPATH=/font/');
$fontname 'msyh.ttf';
 
//用ImageTTFText函数将汉字写到图片上.
ImageTTFText ($img1206620$white$fontname$single_hanzi);
 
// 输出图片
header("Content-type: " image_type_to_mime_type(IMAGETYPE_PNG));
imagepng($img);
imagedestroy($img);
?>
2. 插件主体.php(UTF-8)
PHP 代码:
<?php
/*
Plugin Name: WP-ImgCode
Plugin URI: http://www./
Description: 图形验证码
Version: 1.0.0
Author: dualface
Author URI: http://www./
*/
 
/*
* UpDate By ETiV
*/
 
//如果(非 类已存在('wp_imgcode')):
//..........易语言?!
if(!class_exists('wp_imgcode')):
 
//类名与类中的一个函数名相同:
//属于类的构造函数, 这样写可兼容PHP4...
class wp_imgcode
{
    var 
$version '1.0.0';
    var 
$plugin_dir '/wp-content/plugins/wp-imgcode';
    function 
wp_imgcode() {
        @
session_start();
        
add_action('comment_form', array(& $this'edit_comment_blog'));
        
add_filter('preprocess_comment', array(& $this'preprocess_comment'));
    }
    function 
edit_comment_blog() {
 
//从此处开始修改...
//先写两个javascript的函数
//第一个函数, img_reload()
//可以重新载入验证码图片...
//并且将评论框(comment)及提交按钮解锁.
//warning函数, 将在提交上来的验证码错误时, 弹出一个错误提示.
//剩下就是基本的HTML了...
 
//**另外, 修正了原作者的
//<img src="{$this->plugin_dir}/imgcode.php" border="0" />
//虽然我不知道"{$this->plugin_dir}"中的{}是什么意思,
//但是这样会使在显示单篇帖子时发生错误.
//如果Blog使用了永久链接, 增强搜索引擎优化的话.
//则在察看帖子时, 将会使用当前地址读取图片, 造成图片显示为x. 
?>
<script>
 function img_reload(){
  var ElemImg = document.getElementById('codeimg');
  ElemImg.removeAttribute('src');
  document.getElementById('submit').removeAttribute('disabled');
  document.getElementById('comment').removeAttribute('disabled');
  ElemImg.setAttribute('src', '<?php echo $this->plugin_dir ?>/imgcode.php');
  }
 function warning(){
  alert('注意:请输入正确的验证码!!!');
  }
 </script>
<p>
<a href="javascript:img_reload();"><img src="<?php echo $this->plugin_dir ?>/imgcode.php" border="0" id="codeimg" title="看不清楚?"/>看不清楚?</a><br />
<input type="text" name="imgcode" id="imgcode" size="6" tabindex="4" />
<label for="imgcode"><small>ImgCode</small></label>
</p>
<?php
    
}
    function 
preprocess_comment($commentdata) {
 
//strtolower函数, 将字符串变成小写.
//这样可以避免验证码大小写输入错误造成的麻烦.
 
        
if (strtolower($_POST['imgcode']) != strtolower($_SESSION['IMGCODE']) || time() >= $_SESSION['IMGCODE_EXPIRED']) {
 
//如果错误, 则终止程序运行, 且运行js函数->warning().
            
die('<script>warning();img_reload();</script>');
        }
        unset(
$_SESSION['IMGCODE']);
        unset(
$_SESSION['IMGCODE_EXPIRED']);
        return 
$commentdata;
    }
}
 
//结束如果;
endif;
 
/**
 * Instatiate the global object.
 */
if( !isset($wp_imgcode) )
{
 
$wp_imgcode =& new wp_imgcode();
}
?>
总结:
插件不错, 代码简洁, 而且易用性很高...
只不过作者考虑有些欠缺, 会造成一些麻烦...
比如, 如果验证码输入错误, 则必须刷新整个页面才能更换验证图片
(想给输入错误的人带来些惩罚?这惩罚未免太重了吧...)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多