Не сте регистриран! Регистрирайте се БЕЗПЛАТНО, за да използвате услугите на сайта!

   Рубрики
 
 
 
 

 Форуми
» SEO и оптимизация
» Всичко за PHP и Perl
» Всичко за C, C++ и .NET
» Всичко за Java и JSP
» Всичко за SQL и MySQL
» Всичко за XHTML и CSS
» Презентация на сайтове
 Обработка на изображения с PHP и GD
  1. Формуляри, защитени от ботове
iwanov
     
Автор  iwanov (09.01.2008 12:49)  съобщение до автора
Погледнат  2876 пъти  добави към любими
Оценка  добави коментар
Гласове  --  изпрати на приятел
Коментари  (0)  абонирай се за PHP
    Страница 1 / 1

 



В този урок ще покажа как да затрудняваме изпращането на формуляри от автоматизирани инструменти. Стъпките на този основен скрипт включват създаване на пространство за чертане, определяне на цветоте, запълване на фона, изчертаване на знаковете, прилагане на знаковете, прилагане на изкривявания и изпращане на изображението към браузъра:

CODE
1
2
3
4
5
6
7
8
9
<?php
$size_x = 200;
$size_y = 75;
if (!isset ($_GET['code'])) {
   
$code = 'unknown';
}
$code = substr($_GET['code'], 0, 8);
$space_per_char = $size_x / (strlen($code) + 1);
?>

В горния код задаваме хоризонталните и вертикалните размери на изображенията в променливи, така че бъдещите промени да са по-лесни. След това взимаме кода от GET параметара code и го отрязваме най-много до осем знака. Накрая изчисляваме $space_per_char - разтоянието между буквите, което ще се използва при последвалото рендиране по-късно в скрипта.

ЗАБЕЛЕЖКА:
Естествено, използването на $_GET параметрите за взимането на кода обезмисля целия скрипт, тъй като всеки робот може просто да прочете HTML файла, съдържащ реда <img src='image.php?code=foobar'/>. За да работи правилно тази концепция, кодът трябва да се съхранява в база данни и скриптът за генерирането на изображението да го прочита например чрез случайно генериран ключ. Това би изглеждало горе доло така:

CODE
1
2
3
4
5
<?php
mysql_connect();
$rez = mysql_query('SELECT code FROM codes WHERE key='. (int) $_GET['key']);
$code = mysql_rezult($rez, 0);
?>

и да бъде вградено в HTML страницата чрез:

CODE
1
<img src='image.php?key=90'/>

CODE
1
2
3
4
<?php
/* Създаване на платното */
$img = imagecreatetruecolor($size_x, $size_y);
?>

Чрез imagecreatetruecolor(), създаваме ново "платно" за рисуване с 256 различни нюанса на червеното, зеленото и синиото, както и отделен алфа канал за всеки пиксел. PHP предоставя и друк вариант на imagecreate, който се използва за създаване на изображения с фиксирана палитра, с най много 256 цвята, но imagecreatetruecolor() се използва по-често, тъй като генерираните от нея изображения обикновено изглеждат по добре. JPEG и PNG файловете поддържат изображения с true color (24 битов цвят), така че за нашия PNG фаил ще използваме тази функция. Фонът по подразбиране е черен тъй като искаме да променим фона, ще трябва да "заделим" някои цветове ето така:

CODE
1
2
3
4
5
6
7
8
<?php
/* Заделяне на цветове */
$background = imagecolorallocate($img, 255, 255, 255);
$border = imagecolorallocate($img, 128, 128, 128);
$colors[] = imagecolorallocate($img, 128, 64, 192);
$colors[] = imagecolorallocate($img, 192, 64, 128);
$colors[] = imagecolorallocate($img, 108, 192, 64);
?>

В горния код използваме imagecolorallocate() за дефиниране на пет различни цвята - $background, $border и $colors, което е масив от три различни цвята за рендирането на текста. При всяко извикване на функцията подаваме променливата $img (ресурсът на изображението, връщан от функцията imagecreatetruecolors() по-горе в скрипта ), следвана от три параметара, определящи стойностите за цвета. Първият от тези параметри определя количеството червено в цвета, вторият определя стойстта на синия канал, а третият показва количеството зелено. Стойностите на трите основни цвята варират от 0 до 255. Бяло например се задава чрез 255, 255, 255 ,а черното е 0, 0, 0. В нашия скрипт, $backgraund e бял, а $border се дефинира с 50-процентови стойности, което е сиво. Ако желаете можете да си добавите още цветове.

CODE
1
2
3
4
5
<?php
/* Попълване на фона */
imagefilledrectangle($img, 1, 1, $size_x - 2, $size_y - 2, $backgraund);
imagerectangle($img, 0, 0, $size_x - 1, $size_y - 1, $border);
?>

Посредством тези тези две функции променяме цвета на фона на бял и добавяме сивата рамка. И двете функции приемат едни и същи параметри:
ресурса на изображението, координатите на горния ляв ъгъл, координатите на долен десен ъгъл и цвета. Координатите варират от 0, 0 до size_x - 1, size_y - 1, т.е. очертаваме запълнен правоъгълник от позиция 1, 1 до size_x - 2, size_y - 2. Освен това изчертаваме и сива рамка по края на изображението.

CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
/* изчертаване на текста */
for ($i = 0; $i < strlen($code); $i++)
{
   
$color = $colors[$i % count($colors)];
   
imagettftext(
       
$img,
       
25 + rand(0, 8),
        -
20 + rand(0, 40),
       
($i + 0.3) * $spacer_per_char,
       
50 + rand(0, 10),
       
$color,
       
'arial.ttf',
       
$code{$i}
    )
;
}
?>

В този код обхождаме в цикал всички знакове на нашия кодов низ. Първо взимаме следващия елемент от масива с цветовете. Използваме оператора модул (%), за да сме сигурни, че в масива има елемент с такъв ключ. След това използваме функцията imagettftext(), за да изчертаем буквата.

CODE
1
2
3
4
<?php
/* Добавяне на някои сличайни смущения */
imageantialias($img, true);
?>

Този ред активира изграждането на линии (anti-aliasing). Изграждането на линии е техника за създаване на по гладки линии.

CODE
1
2
3
4
5
6
7
8
9
10
<?php
for($i = 0; Si < 1000; Si++)
{
   
$x1 = rand(5, size_x - 5);
   
$y1 = rand(5, size_y - 5);
   
$x2 = $x1 - 4 + rand(0, 8);
   
$y2 = $y1 - 4 + rand(0, 8);
   
imageline($img, $x1, Sy1, $x2, $y2, $color[rand(0, count($color) - 1)] );
}
?>

Изчертаваме 1000 малки линии с произволни координати за начало край. Функцията imageline() е със следните параметри: ресурс на изображението, начални x и y координати, крайни x и y координати, цвета, с който да се изчертае линията.

CODE
1
2
3
4
5
<?php
/* Извеждане в браузър */
header('Content-type: image/png');
imagepng($img);
?>

В края на нашия скрипт използваме фунцията header(), за да наредим на браузара да очаква данни, представляващи image/png. Този mime тип се асоциира от браузара с PNG изображение, така че той знае как да обработи правилно данните. Различните типове данни са с различни mime типове. За изображенията, може да се задава image/gif (за GIF изображения), image/jpeg (за JPEG изображения), application/octet-stream (за двоични данни) и други mime типове. Чрес HTTP хедара Content-type казваме на браузара какво да очаква. Функцията header() може да се използва, само ако не е изпратено никакво съдържание преди самия хедър. Това означава никакви интервали, никакви HTML тагове, абсолютно нищо. Ако преди конструкцията header се изпрати някакво съдържание, ще получите предобреждение подобно на:

Warning: Cannot modify header information - header already send by (output started at /usr/book/gd/antibot.php:2) in /usr/book/gd/antibot.php on line 53

Накрая извикваме функцията imagepng(), която за първи параметър приема ресурса на изображението. Вторият и параметър не е задължителен: име на файла в който да се съхранява изображението. Ако няма втори параметър функцията "отпечатва" всички данни за изображението в браузара.



   


Ключови думи: PHP GD формуляр защита бот изображение


Още уроци от тази рубрика


 
  • Подобни теми от myLinks
 

 За автора: iwanov  
Казвам се Галин Иванов и обичам да се занимавам с програмиране и като цяло с компютри. Разбирам от HTML, CSS, PHP и MySQL. Старая се да научавам постоянно нови неща от IT сферата.
   
 1 посетител чете този урок (0 потребители и 1 гост)  
Активни потребители: ---
   
  

Еmail  
 

 

 
  • Интересно от Софтуер
 



IT-PLACE.NET © 2004 - 2008