GD Captcha Generator в C - PullRequest
       8

GD Captcha Generator в C

0 голосов
/ 10 августа 2010

Я пишу приложение fastcgi для моего сайта на языке C.

Как использовать GD для создания изображения CAPTCHA?

Я напрасно искал кое-что в Google (поиск продолжается), но было бы неплохо, если бы кто-нибудь дал мне основную идею о процедуре.

Для случайных чисел я буду использовать наносекунды в качестве начального числа (или использовать это само).

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 10 августа 2010

Посмотрите на пример кода void gdImageStringUp(gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color) (FUNCTION) (его можно скопировать и вставить) ..

  #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

Шум создается случайными пикселями / строками/ etc, что тривиально:

  /*... 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 насчитывает около тысячи примеров на своем веб-сайте.

1 голос
/ 10 августа 2010

Я не уверен, что такое GD, но я предполагаю, что это своего рода библиотека изображений, но я могу дать вам представление о реализации всей функции капчи:

  1. вы добавляете<img> тег, который ссылается на ваше приложение cgi и отправляет параметр «seed».Вы пишете начальное число из кода php, потому что на втором шаге.
  2. вы добавляете в форму скрытое поле, содержащее начальное число с первого шага. Оно должно быть таким же.
  3. в php-файле, на который вы ссылаетесь в вашей форме, у вас есть функция, которая генерирует число капчи из начального числа. Это реплицируется в вашем C-файле!
  4. В вашем CGI-файле вы используете сгенерированную выше капчу и рисуете цифры на изображении, применяете некоторые случайные преобразования (второстепенные вещи, такие как перемещенные пиксели 2-3 пикселя вокруг, рисование линий и т. Д.), А затем возврат данных изображения.
  5. в php-файле, который перенаправляет ваша форма, чтобы вы воссоздали значения из скрытого поля, в котором содержится начальное число, и проверяет, что пользователь вводит.

Что касается генератора капчи из начального числа, то этого должно быть достаточно:

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;
}
...