我这个想法好不好?

Meteorlet 2005-01-06 08:15:19
现在为了防止入侵,登陆都增加了验证码,但是PHP要用到GD库,影响速度,而且很多虚拟主机也不支持,我下面这个想法就是用HTML来画数字,这样大家觉得好不好?
<?php

/*

* 将字符串用HTML来图形化输入

* @参数: $str [in]

* 待显示的字符串

* @参数: $cr [in]

* 显示字符串的颜色,字符串形式, 如"#FFFFFF"

* @返回: NULL

*/

function ShowDigit($str,$cr)

{

/* 字符宽度跟高度 */

$CHAR_WIDTH = 16;

$CHAR_HEIGHT = 16;



/* 数字的点阵 */

$digit['0'] = array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,

0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,

0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,

0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,

0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,

0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,

0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,

0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,

0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,

0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,

0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,

0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);

$digit['1'] = array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,

0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,

0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,

0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,

0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);

$digit['2'] = array(0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,

0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,

0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,

0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,

0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,

0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,

0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,

0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,

0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,

0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,

0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,

0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,

0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);



/* 字符个数 */

$count = strlen($str);



/* 步长 */

$stride = $CHAR_WIDTH * $count;



/* 把每一个数字的点阵存入显示数组中 */

for( $c = 0; $c < strlen($str); $c ++)

{

$k = 0;

for ($i = 0; $i <16; $i ++)

{

for ($j = 0; $j <16; $j ++)

{

$a[$j + $i * $stride + $c * $CHAR_WIDTH] = $digit[$str{$c}][$k++];

}

}

}



/* 用HTML的形式显示数字 */

echo "<table cellspacing='0' cellpadding='0' bgcolor='#FFFFFF'>";

for ($j = 0; $j < $CHAR_HEIGHT; $j ++)

{

echo "<tr>\n";

for ($i = 0; $i < $stride; $i ++)

{

if ($a[$i + $j * $stride] == 0)

{

echo "<td height=1 width=1 bgcolor='#FFFFFF'></td>\n";

} else {

echo "<td height=1 width=1 bgcolor='$cr'></td>\n";

}

}

echo "</tr>\n";

}

echo "</table>";

}



/* 例子 */

ShowDigit("01101210101021010", '#FF9000');

?>
...全文
116 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tony-杨 2005-01-07
  • 打赏
  • 举报
回复
感觉上不太好
李世垚 2005-01-07
  • 打赏
  • 举报
回复
不好
Meteorlet 2005-01-07
  • 打赏
  • 举报
回复
只要是图片文件都可以读,gif,jpg,png按照一定的格式都可以解码出来,但是我这样把每一个点都用HTML输出出来,用颜色区分数字是可以加密的(比如说0的地方用随机生成的颜色,只要与显示数字的颜色反差很大就行了),还可以通过矩阵变换把数字变形的。就算读到html也要通过模式去识别数字还是有难度的。
xuzuning 2005-01-07
  • 打赏
  • 举报
回复
XBM格式图片一样能被程序简单的读到

可改用png图片

polygame 2005-01-06
  • 打赏
  • 举报
回复
不好。验证码的意义就是为了不让程序能简单的读到

你输出XBM格式图片不需要用到GD的。




function setXBM($num,$mode=0)
{
settype($num,"string");
$mode = $mode?0xff:0x00;
$int_width = strlen($num); //位数
$count_width=8; //单个数字宽度
$count_height=16; //高度

$bitmap = array(
0 => array(0xff, 0xff, 0xff, 0xc3, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0x99, 0xc3, 0xff, 0xff, 0xff),
1 => array(0xff, 0xff, 0xff, 0xcf, 0xc7, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xcf, 0xff, 0xff, 0xff),
2 => array(0xff, 0xff, 0xff, 0xc3, 0x99, 0x9f, 0x9f, 0xcf, 0xe7, 0xf3, 0xf9, 0xf9, 0x81, 0xff, 0xff, 0xff),
3 => array(0xff, 0xff, 0xff, 0xc3, 0x99, 0x9f, 0x9f, 0xc7, 0x9f, 0x9f, 0x9f, 0x99, 0xc3, 0xff, 0xff, 0xff),
4 => array(0xff, 0xff, 0xff, 0xcf, 0xcf, 0xc7, 0xc7, 0xcb, 0xcb, 0xcd, 0x81, 0xcf, 0x87, 0xff, 0xff, 0xff),
5 => array(0xff, 0xff, 0xff, 0x81, 0xf9, 0xf9, 0xf9, 0xc1, 0x9f, 0x9f, 0x9f, 0x99, 0xc3, 0xff, 0xff, 0xff),
6 => array(0xff, 0xff, 0xff, 0xc7, 0xf3, 0xf9, 0xf9, 0xc1, 0x99, 0x99, 0x99, 0x99, 0xc3, 0xff, 0xff, 0xff),
7 => array(0xff, 0xff, 0xff, 0x81, 0x99, 0x9f, 0x9f, 0xcf, 0xcf, 0xe7, 0xe7, 0xf3, 0xf3, 0xff, 0xff, 0xff),
8 => array(0xff, 0xff, 0xff, 0xc3, 0x99, 0x99, 0x99, 0xc3, 0x99, 0x99, 0x99, 0x99, 0xc3, 0xff, 0xff, 0xff),
9 => array(0xff, 0xff, 0xff, 0xc3, 0x99, 0x99, 0x99, 0x99, 0x83, 0x9f, 0x9f, 0xcf, 0xe3, 0xff, 0xff, 0xff)
);

echo "#define counter_width " .($count_width * $int_width)."\r\n";
echo "#define counter_height " .$count_height. "\r\n";
echo "static unsigned char counter_bits[] = {\r\n";
for($i=0; $i<$count_height; ++$i) {
for($j = 0; $j < $int_width; ++$j) {
printf("0x%2x, ",$bitmap[$num[$j]][$i]^$mode);
}
}
echo "\r\n};";
}

21,893

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧