2010-08-10 21 views
-1

J'écris une application FastCGI pour mon site en C.GD Captcha Generator dans C

Comment puis-je utiliser GD pour générer une image CAPTCHA? En vain, je cherchais des trucs sur google (encore la recherche continue), mais ce serait bien si quelqu'un pouvait me donner l'idée de base de la procédure.

Pour les nombres aléatoires, j'utiliserai des nanosecondes en tant que germe (ou l'utilise lui-même).

Merci d'avance.

Répondre

2

Regardez l'exemple de code void gdImageStringUp(gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color) (FUNCTION) (vous pouvez très bien copier-coller) ..

#include "gd.h" 
    #include "gdfontl.h" 
    #include <string.h> 

    /*... inside a function ...*/ 
    gdImagePtr im; 
    int black; 
    int white; 
    /* String to draw. */ 
    char *s = "Hello."; 
    im = gdImageCreate(100, 100); 
    /* Background color (first allocated) */ 
    black = gdImageColorAllocate(im, 0, 0, 0); 
    /* Allocate the color white (red, green and blue all maximum). */ 
    white = gdImageColorAllocate(im, 255, 255, 255); 
    /* Draw a centered string going upwards. Axes are reversed, 
    and Y axis is decreasing as the string is drawn. */ 
    gdImageStringUp(im, gdFontGetLarge(), 
    im->w/2 - gdFontGetLarge()->h/2, 
    im->h/2 + (strlen(s) * gdFontGetLarge()->w/2), s, white); 
    /* ... Do something with the image, such as 
    saving it to a file... */ 
    /* Destroy it */ 
    gdImageDestroy(im); 

http://www.libgd.org/Font

Le bruit se fait avec des pixels/lignes/etc aléatoire, ce qui est trivial:

/*... inside a function ...*/ 
    gdImagePtr im; 
    int black; 
    int white; 
    im = gdImageCreate(100, 100); 
    /* Background color (first allocated) */ 
    black = gdImageColorAllocate(im, 0, 0, 0); 
    /* Allocate the color white (red, green and blue all maximum). */ 
    white = gdImageColorAllocate(im, 255, 255, 255); 
    /* Set a pixel near the center. */ 
    gdImageSetPixel(im, 50, 50, white); 
    /* ... Do something with the image, such as 
    saving it to a file... */ 
    /* Destroy it */ 
    gdImageDestroy(im); 

http://www.libgd.org/Drawing

LibGD a comme des exemples de zillion sur leur site Web.

1

Je ne suis pas sûr de ce que GD est, mais je suppose que c'est une sorte d'une bibliothèque d'images, mais je peux vous donner une idée de mettre en œuvre toute chose captcha:

  1. vous ajoutez une balise <img> qui lie à votre application CGI et envoie un paramètre "seed". Vous écrivez la graine du code php vous, à cause de la 2ème étape.
  2. vous ajoutez un champ caché dans votre formulaire qui contient la graine de l'étape 1. Elle doit être la même.
  3. dans le fichier php que vous liez dans votre formulaire, vous avez une fonction qui génère un numéro captcha à partir de la graine. Ceci est répliqué dans votre fichier C!
  4. dans votre fichier cgi vous utilisez le captcha généré ci-dessus et dessinez les nombres sur l'image, appliquez une transformation aléatoire (choses mineures, comme des pixels déplacés de 2-3 pixels, dessinez des lignes, etc.) .
  5. Dans le fichier php que votre formulaire vous redirige régénérer les valeurs du champ caché qui détient la graine et les tests par rapport à ce que l'utilisateur entre.

En ce qui concerne un générateur de captcha d'une graine, quelque chose comme cela devrait suffire:

static int seed; // write to this when you get the value 
int nextDigit() 
{ 
    seed=seed*32423+235235; 
    seed^=0xc3421d; 
    return seed%10; // %26 if you want letters, %36 if you want letters+numbers 
} 

int captcha() 
{ 
    return nextDigit()+nextDigit()*10+nextDigit()*100+ 
    nextDigit()*100+nextDigit()*10; 
} 
+0

Très probablement, je vais utiliser captcha numérique, mais votre code est la peine d'essayer. :) Merci. – Nilesh