Script captcha generator in PHP does not generate the image

2

I am trying to run the site script below, which generates captcha, but the image is never generated. Can someone give me a light of what I can be doing? I'm running the script via docker.

Page: link

index.php

<!--
No campo src da tag img abaixo enviaremos 4 parametros via GET
l = largura da imagem
a = altura da imagem
tf = tamanho fonte das letras
ql = quantidade de letras do captcha
-->
<img src="captcha.php?l=150&a=50&tf=20&ql=5">
<!--
O texto digitado no campo abaixo sera enviado via POST para
o arquivo validar.php que ira vereficar se o que voce digitou é igual
ao que foi gravado na sessao pelo captcha.php
-->
<form action="validar.php" name="form" method="post">
   <input type="text" name="palavra"  />
   <input type="submit" value="Validar Captcha" />
</form>

captcha.php

<?php
   session_start(); // inicial a sessao
   header("Content-type: image/jpeg"); // define o tipo do arquivo

    function captcha($largura,$altura,$tamanho_fonte,$quantidade_letras){
        $imagem = imagecreate($largura,$altura); // define a largura e a altura da imagem
        $fonte = "arial.ttf"; //voce deve ter essa ou outra fonte de sua preferencia em sua pasta
        $preto  = imagecolorallocate($imagem,0,0,0); // define a cor preta
        $branco = imagecolorallocate($imagem,255,255,255); // define a cor branca

        // define a palavra conforme a quantidade de letras definidas no parametro $quantidade_letras
        $palavra = substr(str_shuffle("AaBbCcDdEeFfGgHhIiJjKkLlMmNnPpQqRrSsTtUuVvYyXxWwZz23456789"),0,($quantidade_letras)); 
        $_SESSION["palavra"] = $palavra; // atribui para a sessao a palavra gerada
        for($i = 1; $i <= $quantidade_letras; $i++){ 
        imagettftext($imagem,$tamanho_fonte,rand(-25,25),($tamanho_fonte*$i),($tamanho_fonte + 10),$branco,$fonte,substr($palavra,($i-1),1)); // atribui as letras a imagem
        }
        imagejpeg($imagem); // gera a imagem
        imagedestroy($imagem); // limpa a imagem da memoria
    }

    $largura = $_GET["l"]; // recebe a largura
    $altura = $_GET["a"]; // recebe a altura
    $tamanho_fonte = $_GET["tf"]; // recebe o tamanho da fonte
    $quantidade_letras = $_GET["ql"]; // recebe a quantidade de letras         
que o captcha terá
    captcha($largura,$altura,$tamanho_fonte,$quantidade_letras); //         
executa a funcao captcha passando os parametros recebidos
?>

validar.php

<?php
   session_start();
    if ($_POST["palavra"] == $_SESSION["palavra"]){
        echo "<h1>Voce Acertou</h1>";
    }else{
        echo "<h1>Voce nao acertou!</h1>";
        echo "<a href='index.php'>Retornar</a>";
    }
?>

Error:

    
asked by anonymous 21.04.2018 / 19:48

1 answer

2

Your code is correct, what is causing error is a very common problem in the imagettftext() function. The problem of appending the font to the text in fontfile of the function.

According to the manual :

  

Depending on which version of the GD library PHP is using, when   fontfile does not start with a leading / then .ttf will be appended to the name of the   file and the library will try to look for that name over a    source path defined by the library .

When I tried to use the font just like you, in the same directory like this:

 $fonte = "arial.ttf";

The image has been broken. Just comment on this line to see the error:

 // header("Content-type: image/jpeg");

Error:

  

imagettftext (): Invalid font filename

When I changed to absolute paths:

 $fonte = "C:/Windows/fonts/arial.ttf";
 // ou
 $fonte = "C:/wampp/www/app/fontes/arial.ttf";
 // ou
 $fonte = "C:/xampp/htdocs/app/fontes/arial.ttf";

The result was:

Anotheroptionthatthemanualadvisesifyouareusingtheimageinthesamedirectoryistodothis:

putenv('GDFONTPATH='.realpath('.'));$font="Arial"; 

It did not work for me. I'd rather do this:

$fonte = getcwd()."/arial.ttf"; // isso funciona

As getcwd() there will be no problems when the script is for production.

    
21.04.2018 / 21:41