需要为PHP验证码图像使用不同的字体

需要为PHP验证码图像使用不同的字体,php,fonts,captcha,Php,Fonts,Captcha,我有一个非常可靠的PHP表单(在防止垃圾邮件方面),我已经使用多年了,但是我想更改captcha使用的字体,因为很多时候人们无法区分数字“0”和大写字母“O”,然后他们认为我的表单“不起作用”,我收到了投诉。我不确定它当前使用的字体-请参阅 但我想把它改成可读性更好的字体,比如“Times New Roman”,Times或衬线 以下是生成验证码图像的php代码: <?php if (!isset($_SESSION)) session_start(); header("(anti

我有一个非常可靠的PHP表单(在防止垃圾邮件方面),我已经使用多年了,但是我想更改captcha使用的字体,因为很多时候人们无法区分数字“0”和大写字母“O”,然后他们认为我的表单“不起作用”,我收到了投诉。我不确定它当前使用的字体-请参阅


但我想把它改成可读性更好的字体,比如“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';