Skocz do zawartości
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

Zaloguj się, aby obserwować  

  • Kto przegląda   0 użytkowników

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

×

Ważne informacje

Kontynuując przeglądanie strony, wyrażasz zgodę na używanie przez nas plików cookies.