需要为PHP验证码图像使用不同的字体
我有一个非常可靠的PHP表单(在防止垃圾邮件方面),我已经使用多年了,但是我想更改captcha使用的字体,因为很多时候人们无法区分数字“0”和大写字母“O”,然后他们认为我的表单“不起作用”,我收到了投诉。我不确定它当前使用的字体-请参阅需要为PHP验证码图像使用不同的字体,php,fonts,captcha,Php,Fonts,Captcha,我有一个非常可靠的PHP表单(在防止垃圾邮件方面),我已经使用多年了,但是我想更改captcha使用的字体,因为很多时候人们无法区分数字“0”和大写字母“O”,然后他们认为我的表单“不起作用”,我收到了投诉。我不确定它当前使用的字体-请参阅 但我想把它改成可读性更好的字体,比如“Times New Roman”,Times或衬线 以下是生成验证码图像的php代码: <?php if (!isset($_SESSION)) session_start(); header("(anti
但我想把它改成可读性更好的字体,比如“Times New Roman”,Times或衬线 以下是生成验证码图像的php代码:
<?php if (!isset($_SESSION)) session_start(); header("(anti-
spam-content-type:) image/png");
$enc_num = rand(0, 9999);
$key_num = rand(0, 24);
$hash_string = substr(md5($enc_num), $key_num, 5); // Length of
String
$hash_md5 = md5($hash_string);
$_SESSION['verify'] = $hash_md5;
// Fallback
setcookie("verify", $hash_md5, time()+3600, "/");
session_write_close();
// Verification Image Background Selection
$bgs = array("img/1.png","img/2.png","img/3.png");
$background = array_rand($bgs, 1);
// Verification Image Variables
$img_handle = imagecreatefrompng($bgs[$background]);
$text_colour = imagecolorallocate($img_handle, 108, 127, 6);
$font_size = 5;
$size_array = getimagesize($bgs[$background]);
$img_w = $size_array[0];
$img_h = $size_array[1];
$horiz = round(($img_w/2)-
((strlen($hash_string)*imagefontwidth(5))/2), 1);
$vert = round(($img_h/2)-(imagefontheight($font_size)/2));
// Make the Verification Image
imagestring($img_handle, $font_size, $horiz, $vert, $hash_string,
$text_colour);
imagepng($img_handle);
// Destroy the Image to keep Server Space
imagedestroy($img_handle);
?>
然后是一个变量:
$font='serif'强>
但是验证码不会生成
我做错了什么?我只希望字体是衬线格式。
有没有一种简单的方法可以在不托管字体文件或不将其指向用户PC的字体位置(例如:C:\Windows\Fonts\serif.ttf…不使用后者的原因是,如果有人使用android智能手机,那么位置C:\Windows\Fonts\serif.ttf将不起作用)的情况下向验证码声明字体类型(serif).该函数无法使用TTF字体
若你们想使用那个种serifttf字体,你们需要切换并使用这个函数,这个函数要求你们的PHP安装是用FreeType支持构建的
您还意识到,由于您使用md5构建验证码,它将无法包含O(oh)字符,因为md5将返回一个由[0-9a-f]
组成的字符串?他们可能把零误认为是O,而实际上它不能包含O
您应该从排除不可区分字符(1、l、I、0、O等)的字符集生成字母
但是我想把它改成一种可读性更好的字体,比如“Times New Roman”,Times或serif。验证码的全部意义在于计算机很难阅读,因此会出现奇怪的字体。或者,切换到ReCaptcha。屏幕截图中显示的验证码不太可能有效,因为文本很容易阅读。为什么不改用类似的东西?@ceejayoz。。。你是说如果它更容易被人阅读,那就意味着它更容易受到垃圾邮件的攻击?如果我将验证码图像放大,是否同样适用?如果是这样的话,最好测试一下差异,看看我是否收到了更多(或更多)spam@Chris ... 我已经考虑过这个问题,但我知道(以我有限的知识)我可能很难将它整合到我当前的表单设置中。也许不是。。。但在此期间,我只想坚持这个验证码,然后随着时间的推移,我将尝试在谷歌工作reCAPTCHA@user3364730,那么你最好放弃这个验证码。这几乎是无用的。我想根本不必填写它将减少您与验证码相关的投诉:-)。非常感谢您的帮助!你提出了一些有趣的观点!您关于构建字符集的建议很有意义,我认为这是最简单的解决方案(至少对我来说)。。。我尝试添加
$charset='abcdefghkmnpqrstuvwxyz23456789'代码>到我的代码,但排除的字符仍在我的验证码中生成。我认为这不是简单地在上面的代码中添加这个变量的情况,对吗?此外,我还需要做什么?是的,然后您必须编写几行代码,从集合中选择一些随机字符,构建captcha字符串,然后用随机生成的字符串替换$hash_字符串。
imagestring($img_handle, $font, $font_size, $horiz, $vert,
$hash_string,
$charset = 'abcdefghkmnpqrstuvwxyz23456789';