不管是防小人也好,还是防君子手误也罢,很多地方都需要用到图片验证码来加强安全性。在 PHP 站点上我选择了 Captcha,用起来很简单的。
Captcha 从 http://www.captcha.ru/en/kcaptcha/ 下站,当前版本是 KCAPTCHA 1.2.6。
下载后,解压后,可以看到它自己带了例子,就是 index.php 用来产生图片,form_example.php 中引入了图片, 只是 <img src="./?<?php echo session_name()?>=<?php echo session_id()?>"> 的写法有点不好理解,要是写成 <img src="index.php/?<?php echo session_name()?>=<?php echo session_id()?>"> 就好看多了,至少知道 index.php 的内容是个图片。
还是来说说它的用法吧,确切说就是解释一下它的示例代码。分两步:
一:生成图片,并把图片对应的文字放入 Session 中用以比较,文件名为 captcha_image.php,这个 php 产生的内容是个图片:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
include('kcaptcha.php'); <?php if(count($_GET)>0){ //如果请求中有参数就表明是一个验证图片的请求 //后面会看到,<img src= 引用图片时,加了个随机码,也能让图片不缓存 session_start(); } $captcha = new KCAPTCHA(); if(count($_GET)>0){ //把图片文字放入 Session 中,Key 为 captcha_keystring $_SESSION['captcha_keystring'] = $captcha->getKeyString(); } ?> |
二:表单中使用图片,也在此文件中完成了验证,文件:validate_form.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php session_start(); ?> <form action="" method="post"> <p>Enter text shown below:</p> <p><img src="captcha_image.php?<?php echo md5(uniqid(rand(), TRUE));?>"></p> <p><input type="text" name="keystring"></p> <p><input type="submit" value="Check"></p> </form> <?php if(count($_POST)>0){ //点击 Check 按钮时执行验证 if(isset($_SESSION['captcha_keystring']) && $_SESSION['captcha_keystring'] == $_POST['keystring']){ echo "Correct"; }else{ echo "Wrong"; } } unset($_SESSION['captcha_keystring']); ?> |
原例中在使用图片时用的是这样的图片引用:<img src="captcha_image.php?<?php echo session_name()?>=<?php echo session_id()?>,其实后面的参数还是固定的,还不如一个随机数据好。
其实也不必太担心会使用浏览器缓存中的图片,想想,Captcha 也肯定为我们考虑到了这个基本要求的。在 kcaptcha.php 中可以看到下面那一片代码:
1 2 3 4 |
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: post-check=0, pre-check=0', FALSE); header('Pragma: no-cache'); |
作用就是不让浏览器缓存的,总是取服务器上最新生成的图片。
其他相关的配置就是 kcaptcha_config.php 了,默认时生成的图片下方会加行 www.captcha.ru,你肯定不想看到这样的东西。
你可以选择去掉该行,只要把 $show_credits 设置为 false,然后图片高度去掉该行文字原本占去的高度,把 $height 由原来的 60 改为 12。
或者只修改 $credits 改为自己相关的描述,如 $credits = 'unmi.blogjava.net'
其他更多的参数配置看看就知道每项的用意。
参考:1. Cakephp 中使用Captcha实现更加安全的验证码
2. 更多 PHP 验证码生成组件请见:9款PHP 验证码(Captcha)组件
本文链接 https://yanbin.blog/php-image-validator-kcaptcha/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。