Perl – 纯Perl代码生成验证码图片
转自http://blog.csdn.net/KataDoc360/article/details/3429041,测试通过,特留于此以备不时之需。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
#!/usr/bin/perl -w print "Content-type: text/html \n\n"; open (FILE, '>', 'test.bmp'); binmode (FILE); print FILE &bmpNum (&myrand(9999)); close (FILE); sub bmpNum{ my $verifynum=shift; local @n0 = ("3c","66","66","66","66","66","66","66","66","3c"); local @n1 = ("1c","0c","0c","0c","0c","0c","0c","0c","1c","0c"); local @n2 = ("7e","60","60","30","18","0c","06","06","66","3c"); local @n3 = ("3c","66","06","06","06","1c","06","06","66","3c"); local @n4 = ("1e","0c","7e","4c","2c","2c","1c","1c","0c","0c"); local @n5 = ("3c","66","06","06","06","7c","60","60","60","7e"); local @n6 = ("3c","66","66","66","66","7c","60","60","30","1c"); local @n7 = ("30","30","18","18","0c","0c","06","06","66","7e"); local @n8 = ("3c","66","66","66","66","3c","66","66","66","3c"); local @n9 = ("38","0c","06","06","3e","66","66","66","66","3c"); for (my $i = 0; $i < 10; $i++) { for (1 .. 6) { my $a1 = substr("012", int(myrand(3)), 1) . substr("012345", int(myrand(6)), 1); my $a2 = substr("012345",int(myrand(6)),1) . substr("0123", int(myrand(4)), 1); int(myrand(2)) eq 1 ? push(@{"n$i"}, $a1) : unshift(@{"n$i"},$a1); int(myrand(2)) eq 0 ? push(@{"n$i"}, $a1) : unshift(@{"n$i"},$a2); } } my @bitmap = (); for (my $i = 0; $i < 20; $i++) { for (my $j = 0; $j < 4; $j++) { my $n = substr($verifynum, $j, 1); my $bytes = ${"n$n"}[$i]; my $a = int(myrand(15)); $a eq 1 ? $bytes =~ s/9/8/g : $a eq 3 ? $bytes =~ s/c/e/g : $a eq 6 ? $bytes =~ s/3/b/g : $a eq 8 ? $bytes =~ s/8/9/g : $a eq 0 ? $bytes =~ s/e/f/g : 1; push(@bitmap, $bytes); } } for ($i = 0; $i < 8; $i++) { my $a = substr("012", int(myrand(3)), 1) . substr("012345", int(myrand(6)), 1); unshift(@bitmap, $a); push(@bitmap, $a); } my $image = '424d9e000000000000003e0000002800'; $image .= "00002000000018000000010001000000"; $image .= "00006000000000000000000000000000"; $image .= "00000000000000000000FFFFFF00"; $image .= join('', @bitmap); $image = pack ('H*', $image); return $image; } sub myrand { my $max = shift; my $result; my $randseed = $LBCGI::randseed ; $max ||= 1; eval("/$result = rand($max);"); return $result unless ($@); $randseed = time unless ($randseed); my $x = 0xffffffff; $x++; $randseed *= 134775813; $randseed++; $randseed %= $x; return $randseed * $max / $x; } |
perl 验证码写起来比较麻烦,用皕应的HCaptcha能很好地支持,皕应的HCaptcha支持各种语言php/asp/c#/vb/asp.net/perl/ruby/python 等等网络语言,安全性能得到保障,在防止注册机和防止刷票上皕应做得是最好的。皕应官网 http://www.hinsite.com,很多大型的投票都用皕应的HCaptcha,皕应的短信验证码HSMSCaptcha也是一个非常不错的手机验证服务。