2017-01-18 41 views
1

我已經有相當穩定的PHP表單(在防止垃圾郵件方面),我已經使用多年了但是我想更改captcha使用的字體因爲人們常常無法區分數字「0」和大寫字母「O」,然後他們認爲我的表單「不起作用」,我收到了投訴。我不確定它當前使用什麼字體 - 請參閱here需要使用不同的字體爲PHP驗證碼圖像

但我想將它更改爲更具可讀性的字體,如「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); 

    ?> 

現在請注意,我的PHP知識是看齊,與一個2歲的詞彙 - 所以請與我裸露。

前些日子我做了一些研究,但無法再找到這些帖子。

我曾嘗試加入$字體和imagestring內,像這樣:

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

,然後一個變量:

$字體= '襯';

但驗證碼不會生成。

我在做什麼錯?我只是希望字體採用serif格式。 有沒有一種簡單的方法來聲明一個字體類型(襯線)這個驗證碼沒有託管一個字體文件或指向它的用戶PC的字體位置(例如:C:\ Windows \ Fonts \ serif.ttf ...原因爲什麼不對於後者是因爲如果有人使用他們的android智能手機然後位置C:\ Windows \ Fonts \ serif.ttf將不起作用)。

+0

「但我想將它更改爲更具可讀性的字體,如」Times New Roman「,Times或serif。」然後抹掉驗證碼。驗證碼的整個要點對於計算機來說是難以閱讀的,因此也就是奇怪的字體。或者,切換到ReCaptcha。 – ceejayoz

+2

由於文字非常容易閱讀,截圖中顯示的驗證碼不太可能有效。爲什麼不使用[Google的reCAPTCHA](https://www.google.com/recaptcha/intro/index.html)之類的內容? – Chris

+0

@ceejayoz ......所以你告訴我,如果它對人眼更具可讀性,那意味着它更容易受到垃圾郵件的侵害?如果我使驗證碼圖像更大,這同樣適用嗎?如果是這樣,那麼測試差異是否很好,看我是否收到更多(或任何)垃圾郵件 – user3364730

回答

1

imagestring()函數不能使用TTF字體。

如果您想使用該Serif TTF字體,則需要切換並使用imagettftext()函數,該函數需要使用FreeType支持來構建PHP安裝。

你也會意識到,因爲你使用md5來構建你的驗證碼,所以它將不能具有O(哦)字符,因爲md5會返回一個由[0-9a-f]組成的字符串?當它實際上不包含O時,它們可能誤認爲O.

您應該從排除不可區分字符(1,l,I,0,O等)的字符集中構建字母, 。

$charset = 'abcdefghkmnpqrstuvwxyz23456789'; 
+0

非常感謝您的幫助!你提出一些有趣的觀點!你建立一個字符集的建議很有意義,我認爲它是最簡單的解決方案(至少對我來說)...我嘗試在我的代碼中添加'$ charset ='abcdefghkmnpqrstuvwxyz23456789';'但排除的字符仍然生成在我的驗證碼。我認爲這不是在我的代碼中正確添加這個變量的情況嗎?除此之外我還需要做什麼? – user3364730

+0

是的,您必須編寫幾行代碼才能從集合中選取多個隨機字符並構建驗證碼字符串,然後用隨機生成的字符串替換$ hash_string。 – drew010