2017-01-18 16 views
1

私は何年も前から使用してきたかなりのPHPフォーム(スパム防止の点で)を持っていますが、captchaが使用するフォントを変更したい非常に多くの人が数値「0」と大文字「O」を区別できないため、私のフォームが「機能しない」と考えて苦情を受けます。私は現在どのフォントを使用しているのかわかりません - hereを参照してください。PHP Captchaの画像に別のフォントを使用する必要があります

しかし、 "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)に向けることなく、この字幕にフォントタイプ(serif)を宣言する簡単な方法はありますか?後者の理由は、誰かがアンドロイドスマートフォンを使用していて、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()機能を切り替えて使用する必要があります。これは、PHPのインストールをFreeTypeサポートで構築する必要があります。

また、md5を使ってキャプチャコードを作成しているため、md5が[0-9a-f]の文字列を返すので、その文字列にO(オ)文字を入れることはできません。

区別できない文字(1、l、I、0、Oなど)を除いた文字セットから文字を構築する必要があります。 。

$charset = 'abcdefghkmnpqrstuvwxyz23456789'; 
+0

多くのあなたの助けに感謝します!あなたはいくつかの興味深い点を作る!文字セットを構築することの提案は意味をなさないので、私はそれを取るのが最も簡単な解決法です(私にとっては少なくとも)... $ charset = 'abcdefghkmnpqrstuvwxyz23456789';を私のコードに追加しようとしましたが、除外された文字はまだ私のキャプチャ。私はそれが正しい場合上記の私のコードでこの変数を単に追加するのではありませんか?それ以外に必要なことは何ですか? – user3364730

+0

はい、セットからいくつかのランダムな文字を選び、captcha文字列を作成し、$ hash_stringをランダムに生成されたものに置き換えるために、数行のコードを書く必要があります。 – drew010

関連する問題