Skocz do zawartości
Urlop / Vacation Czytaj dalej... ×
  • Zarejestruj się
Zaloguj się, aby obserwować  
Spanner

[Artykuł/Tutorial] Ulepszony obrazek antyspamowy GD

Polecane posty

Tytuł: Ulepszony obrazek antyspamowy GD

Opis:

Kategoria: IP.Board 2.1.x

Data dodania: 01.01.09, 16:53

Autor: Spanner

Artykuł pokaże jak zwiększyć bezpieczeństwo obrazka antyspamowego chroniącego przed botami.

Krok 1.

w katalogu głównym forum tworzymy folder fonts, do środka którego wrzucamy jakieś pliki czcionek o rozszerzeniu ttf, np. Arial i Comic Sans MS, lub jakieś inne które będą wyglądać dobrze na obrazku.

Krok 2.

Otwórz ./sources/ipsclass.php

Znajdź:

function show_gd_img($content="")
{
$content = ' '. preg_replace( "/(\w)/", "\\1 ", $content ) .' ';

@header("Content-Type: image/jpeg");

$tmp_x = 140;
$tmp_y = 20;

$image_x = 210;
$image_y = 65;

$circles = 3;

if ( $this->vars['gd_version'] == 1 )
{
$tmp = imagecreate($tmp_x, $tmp_y);
$im = imagecreate($image_x, $image_y);
}
else
{
$tmp = imagecreatetruecolor($tmp_x, $tmp_y);
$im = imagecreatetruecolor($image_x, $image_y);
}

$white = ImageColorAllocate($tmp, 255, 255, 255);
$black = ImageColorAllocate($tmp, 0, 0, 0);
$grey = ImageColorAllocate($tmp, 210, 210, 210 );

imagefill($tmp, 0, 0, $white);

for ( $i = 1; $i <= $circles; $i++ )
{
$values = array(
0 => rand(0, $tmp_x - 10),
1 => rand(0, $tmp_y - 3),
2 => rand(0, $tmp_x - 10),
3 => rand(0, $tmp_y - 3),
4 => rand(0, $tmp_x - 10),
5 => rand(0, $tmp_y - 3),
6 => rand(0, $tmp_x - 10),
7 => rand(0, $tmp_y - 3),
8 => rand(0, $tmp_x - 10),
9 => rand(0, $tmp_y - 3),
10 => rand(0, $tmp_x - 10),
11 => rand(0, $tmp_y - 3),
);

$randomcolor = imagecolorallocate( $tmp, rand(100,255),
rand(100,255),rand(100,255) );
imagefilledpolygon($tmp, $values, 6, $randomcolor );
}

imagestring($tmp, 5, 0, 2, $content, $black);

//-----------------------------------------
// Distort by resizing
//-----------------------------------------

imagecopyresized($im, $tmp, 0, 0, 0, 0, $image_x, $image_y,
$tmp_x, $tmp_y);

imagedestroy($tmp);

$white = ImageColorAllocate($im, 255, 255, 255);
$black = ImageColorAllocate($im, 0, 0, 0);
$grey = ImageColorAllocate($im, 100, 100, 100 );

$random_pixels = $image_x * $image_y / 10;

for ($i = 0; $i < $random_pixels; $i++)
{
ImageSetPixel($im, rand(0, $image_x), rand(0, $image_y),
$black);
}

$no_x_lines = ($image_x - 1) / 5;

for ( $i = 0; $i <= $no_x_lines; $i++ )
{
// X lines

ImageLine( $im, $i * $no_x_lines, 0, $i * $no_x_lines,
$image_y, $grey );

// Diag lines

ImageLine( $im, $i * $no_x_lines, 0, ($i *
$no_x_lines)+$no_x_lines, $image_y, $grey );
}

$no_y_lines = ($image_y - 1) / 5;

for ( $i = 0; $i <= $no_y_lines; $i++ )
{
ImageLine( $im, 0, $i * $no_y_lines, $image_x, $i *
$no_y_lines, $grey );
}

ImageJPEG($im);
ImageDestroy($im);

exit();
}[/code] [b]Zamień całość na:[/b]
[code]function show_gd_img($content="")
{
$content = preg_replace( "/(\w)/", "\\1 ", $content );

$textarray = explode(' ', $content);

$super_captcha = 0;

$use_jpg = 0;
$use_ttf = 1;
$use_gdf = 0;

$fonts_dir = ROOT_PATH.'fonts/';

$tmp_x = 160;
$tmp_y = 30;

$image_x = 210;
$image_y = 65;

$circles = 3;


$dh = opendir( $fonts_dir );
$fonts = array();
while ($icon = readdir($dh)) {
if(preg_match("/(.gdf)/",$icon) && $use_gdf) {
if($icon != '.' || $icon != '..') {
$gdf_fonts[] = $icon;
}
}
if(preg_match("/(.ttf)/",$icon) && $use_ttf) {
if($icon != '.' || $icon != '..') {
$ttf_fonts[] = $icon;
}
}
if(preg_match("/(.jpg)/",$icon) && $use_jpg) {
if($icon != '.' || $icon != '..') {
$jpg_files[] = $icon;
}
}
}
closedir($dh);

$jpg_max = count($jpg_files) - 1;
$gdf_max = count($gdf_fonts) - 1;
$ttf_max = count($ttf_fonts) - 1;

@header("Content-Type: image/jpeg");

if ( $this->vars['gd_version'] == 1 ) {
$tmp = imagecreate($tmp_x, $tmp_y);
$im = imagecreate($image_x, $image_y);
} else {
$tmp = imagecreatetruecolor($tmp_x, $tmp_y);
$im = imagecreatetruecolor($image_x, $image_y);
}


if($super_captcha) {
$color1 = rand(100,200);
$color2 = rand(100,200);
$color3 = rand(100,200);

$color = imageColorAllocate($tmp, $color1, $color2, $color3);
$textcolor = imageColorAllocate($tmp, $color1 - 10, $color2
- 10, $color3 - 10);

imagefill($tmp, 0, 0, $color);

$shadowcode = rand(20, 50);
$shadowcolor = ImageColorAllocate($tmp, $color1 - 100,
$color2 - 100, $color3 - 100 );

foreach($textarray AS $number) {

$rand = rand(0, $ttf_max);


$fontsize = rand(14,17);
$angle = rand(-10,10);

$aCharDetails = imageftbbox($fontsize, $angle,
$fonts_dir."/".$ttf_fonts[$rand], $number);

$iCharHeight = $aCharDetails[2] - $aCharDetails[5];
$iY = $tmp_y / 2 + $iCharHeight / 4 + rand(-3, 3);

$rand = rand(0, $ttf_max);

$offsetx = 2;
$offsety = 2;

imagefttext($tmp, $fontsize, $angle, $i + $offsetx, $iY
+ $offsety, $shadowcolor, $fonts_dir."/".$ttf_fonts[$rand], $number);

imagefttext($tmp, $fontsize, $angle, $i, $iY,
$textcolor, $fonts_dir."/".$ttf_fonts[$rand], $number);

$i = $i + rand(20, 45 - $fontsize);
}
}else {
if(count($jpg_files) > 0) {
$rand = rand(0, $jpg_max);
$temp =
imagecreatefromjpeg($fonts_dir."/".$jpg_files[$rand]);
list($width, $height) =
getimagesize($fonts_dir."/".$jpg_files[$rand]);

imagecopyresized($tmp, $temp, 0, 0, 0, 0, $tmp_x,
$tmp_y, $width, $height);
}else{
imagefill($tmp, 0, 0, ImageColorAllocate($tmp,
rand(240,250), rand(240,250), rand(240,250)));

for ( $i = 1; $i <= $circles; $i++ )
{
$values = array(
0 => rand(0, $tmp_x - 10),
1 => rand(0, $tmp_y - 3),
2 => rand(0, $tmp_x - 10),
3 => rand(0, $tmp_y - 3),
4 => rand(0, $tmp_x - 10),
5 => rand(0, $tmp_y - 3),
6 => rand(0, $tmp_x - 10),
7 => rand(0, $tmp_y - 3),
8 => rand(0, $tmp_x - 10),
9 => rand(0, $tmp_y - 3),
10 => rand(0, $tmp_x - 10),
11 => rand(0, $tmp_y - 3),
);

$randomcolor = imagecolorallocate( $tmp,
rand(150,200), rand(150,200),rand(150,200) );
imagefilledpolygon($tmp, $values, 6, $randomcolor );
}
}

if(count($textarray) == 5) {
$min = 30;
$max = 40;
}else if(count($textarray) == 6) {
$min = 20;
$max = 30;
}else{
$min = 2;
$max = 10;
}

$i = rand($min, $max);
foreach($textarray AS $number) {
$color = ImageColorAllocate($tmp, rand(50, 150),
rand(50, 150), rand(50, 150) );
$shadowcolor = ImageColorAllocate($tmp, rand(50, 100),
rand(50, 100), rand(50, 100) );

if(count($ttf_fonts) > 0) {
$rand = rand(0, $ttf_max);

$fontsize = rand(18, 20);
$angle = rand(-30, 30);

$aCharDetails = imageftbbox($fontsize, $angle,
$fonts_dir."/".$ttf_fonts[$rand], $number);

$iCharHeight = $aCharDetails[2] - $aCharDetails[5];
$iY = $tmp_y / 2 + $iCharHeight / 4 + rand(-3, 3);

$rand = rand(0, $ttf_max);

$offsetx = rand(1, 2);
$offsety = rand(1, 2);

imagefttext($tmp, $fontsize, $angle, $i + $offsetx,
$iY + $offsety, $shadowcolor, $fonts_dir."/".$ttf_fonts[$rand], $number);

imagefttext($tmp, $fontsize, $angle, $i, $iY,
$color, $fonts_dir."/".$ttf_fonts[$rand], $number);

$i = $i + rand(20, 45 - $fontsize);
}else{
if(count($gdf_fonts) > 0) {
$rand = rand(0, $gdf_max);
$font =
imageloadfont($fonts_dir."/".$gdf_fonts[$rand]);
}else{
$font = rand(15,20);
}

$height = rand(0, 10);

$offsetx = rand(1, 2);
$offsety = rand(1, 2);

imagestring($tmp, $font, $i + $offsetx, $height +
$offsety, $number, $shadowcolor);

imagestring($tmp, $font, $i, $height, $number, $color);

$i = $i + rand(20, 30);
}
}
}



imagecopyresized($im, $tmp, 0, 0, 0, 0, $image_x, $image_y,
$tmp_x, $tmp_y);

imagedestroy($tmp);

if($super_captcha) {
$grey = $shadowcolor;
}else{
$random = rand(0,20);
$grey = ImageColorAllocate($im, $random, $random, $random );
}


$random_pixels = $image_x * $image_y / 10;

for ($i = 0; $i < $random_pixels; $i++) {
$random = rand(0, 255);
$pixelcolor = ImageColorAllocate($im, $random, $random,
$random );
ImageSetPixel($im, rand(0, $image_x), rand(0, $image_y),
$pixelcolor);
}

$no_x_lines = ($image_x - 1) / 10;

for ( $i = 0; $i <= $no_x_lines; $i++ ) {
ImageLine( $im, $i * $no_x_lines, 0, $i * $no_x_lines,
$image_y, $grey );
}

$no_y_lines = ($image_y - 1) / 5;

for ( $i = 0; $i <= $no_y_lines; $i++ ) {
ImageLine( $im, 0, $i * $no_y_lines, $image_x, $i *
$no_y_lines, $grey );
}

ImageJPEG($im);
ImageDestroy($im);

exit();
}

Zapisz zmiany i ciesz się bezpieczniejszym obrazkiem antyspamowym :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się
Zaloguj się, aby obserwować  

  • Kto przegląda   0 użytkowników

    Brak zalogowanych użytkowników przeglądających tę stronę.

×

Ważne informacje

W celu świadczenie usług przez nasz Serwis na najwyższym poziomie, w ramach Serwisu wykorzystujemy pliki Cookies (tzw. ciasteczka). Korzystając ze stron Serwisu IPSBEYOND.PL bez zmiany ustawień przeglądarki będą one zapisane w pamięci urządzenia. Jeżeli nie dokonacie Państwo zmiany ustawień przeglądarki internetowej to wyrażacie zgodę na zapisywanie plików Cookies.