需要为PHP Captcha图像

时间:2017-01-18 14:47:11

标签: php fonts captcha

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

但是我想把它改成一种比“Times New Roman”,Times或serif更具可读性的字体。

这是我生成验证码图像的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);

    ?>

前几天我确实对此进行了一些研究,但又找不到那些帖子了。

我确实尝试在imagestring中添加 $ font ,如下所示:

imagestring($img_handle, $font, $font_size, $horiz, $vert, 
$hash_string, 

然后变量:

$ font ='serif';

但验证码不会生成。

我做错了什么?我只是希望字体采用serif格式。 有没有一种简单的方法来声明这个验证码的字体类型(serif),而无需托管字体文件或将其指向用户PC的字体位置(例如:C:\ Windows \ Fonts \ serif.ttf ...原因不是后者是因为如果有人使用他们的Android智能手机会发生什么,那么位置C:\ Windows \ Fonts \ serif.ttf将不起作用。)

1 个答案:

答案 0 :(得分:1)

imagestring()功能无法使用TTF字体。

如果要使用该Serif TTF字体,则需要切换并使用imagettftext()函数,该函数要求使用FreeType支持构建PHP安装。

你也意识到因为你使用md5来构建你的验证码,它将无法在其中包含O(oh)字符,因为md5将返回一个由[0-9a-f]组成的字符串?当它实际上不能包含O时,它们可能会误认为是零。

你应该从一个字符集构建字母,排除无法区分的字符(1,l,I,0,O等)。

$charset = 'abcdefghkmnpqrstuvwxyz23456789';