logo


home map contact


Если вы видите это сообщение - значит вы используете браузер Internet Explorer. Негативное отношение к этому браузеру сложилось не только у владельца данного ресурса, но и у подавляющего большинства людей, разбирающихся в web технологиях. Попробуйте установить один из браузеров по ссылке ниже, возможно вам он тоже понравится больше!

Opera, the fastest and most secure web browser     Spread Firefox Affiliate Button

генерация изображения со случайным кодом (captcha)

Чаще всего изображения со случайным кодом (так называемая captcha) используются для защиты от флуда (автоматизированного ввода сообщений), некоторые сервисы находят им применнение в качестве раздражителя (для перехода на платный вариант). В общем, может пригодиться. PHP код следующий:
$width = 100;				//Ширина изображения
$height = 60;				//Высота изображения
$font_size = 16;   			//Размер шрифта
$let_amount = 4;			//Количество символов, которые нужно набрать
$fon_let_amount = 30;		//Количество символов на фоне
$font = "fonts/cour.ttf";	//Путь к шрифту
 
//набор символов
$letters = array("a","b","c","d","e","f","g");		
//цвета
$colors = array("90","110","130","150","170","190","210");	
 
$src = imagecreatetruecolor($width,$height);	//создаем изображение				
$fon = imagecolorallocate($src,255,255,255);	//создаем фон
imagefill($src,0,0,$fon);						//заливаем изображение фоном
 
for($i=0;$i < $fon_let_amount;$i++)			//добавляем на фон буковки
{
	//случайный цвет
   	$color = imagecolorallocatealpha($src,rand(0,255),rand(0,255),rand(0,255),100);	
   	//случайный символ
   	$letter = $letters[rand(0,sizeof($letters)-1)];	
	//случайный размер								
   	$size = rand($font_size-2,$font_size+2);											
   	imagettftext($src,$size,rand(0,45),
	   	rand($width*0.1,$width-$width*0.1),
		rand($height*0.2,$height),$color,$font,$letter);
}
 
for($i=0;$i < $let_amount;$i++)		//то же самое для основных букв
{
   $color = imagecolorallocatealpha($src,$colors[rand(0,sizeof($colors)-1)],
   		$colors[rand(0,sizeof($colors)-1)],
   		$colors[rand(0,sizeof($colors)-1)],rand(20,40)); 
   $letter = $letters[rand(0,sizeof($letters)-1)];
   $size = rand($font_size*2-2,$font_size*2+2);
   $x = ($i+1)*$font_size + rand(1,5);		//даем каждому символу случайное смещение
   $y = (($height*2)/3) + rand(0,5);							
   $cod[] = $letter;   						//запоминаем код
   imagettftext($src,$size,rand(0,15),$x,$y,$color,$font,$letter);
}
 
$cod = implode("",$cod);					//переводим код в строку
 
header ("Content-type: image/gif"); 		//выводим готовую картинку
imagegif($src); 
Это максимально упрощенный вариант с использованием только одного шрифта и небольшого количества символов и цветов, хотя и этого бывает достаточно, чтобы оградиться от незатейливых спамеров и флудеров.

Через HTML такое изображение вызывается стандартно:
защитный код

Скачать скрипт генерации защитного кода с полным набором символов и возможностью подключения своих шрифтов можно здесь secpic.zip



Комментарии:



Mastik     15.03.08 в 19:16

Картинка хорошая, спасибо.
Только объясните, пожалуйста, как принимающий скрипт узнает, что на ней нарисовано?





Alek Veritov     17.03.08 в 06:53

через переменную сессии.
когда генерируем изображение - $_SESSION['secpic'] = implode('',$cod);
когда проверяем - if($_SESSION['secpic']==strtolower($_POST['secpic']))





Winxp    13.07.08 в 14:08

Отличный скрипт,большое спасибо





seryjvolk    31.08.08 00:41

в скрипте отличные буквы, мне оч понравился, а если еще и заработает у меня вообще отлично будет




pati    09.10.08 01:08

Спасибо. СимпотишЫне картинки. Будем ща прикручивать к фидбэку. Спасиб автору :)




Faust    22.10.08 19:48

Спасибо! Так лень было самому писать))




DRONNY    31.01.09 19:10

Вставляю следующий код на свою страницу: echo \'<img src=\"captcha.php\">\'; echo <<<HTML <form action=\"\" method=\"post\"> Secpic: <input type=\"text\" maxlength=\"4\" name=\"secpic\" /><br /> <input type=\"submit\" name=\"submit\" value=\"Отправь меня!\" /> </form> HTML; if ($_SESSION[\'secpic\'] == $_POST[\"secpic\"]) {echo \"Код введен правельно.\";} Ввожу код ПРАВЕЛЬНО, но надпись \"Код введен правельно.\" не появляется. Что делать ?




drD0s    25.02.09 15:10

У меня тоже самое, что и у DRONNY! Объясните плиз!




Alek Veritov    25.02.09 15:48

в captcha.php вместо $cod = implode(\"\",$cod); надо написать $_SESSION[\'secpic\'] = implode(\'\',$cod); выведите на экран $_SESSION[\'secpic\'] и $_POST[\"secpic\"], посмотрите что в них и будет вам счастье ...




drD0s    25.02.09 17:18

Разобрался! В самое начало страницы нужно воткнуть начало сессии! <php? Session_start(); ?> <html> ...




CaTacLYSM    03.03.09 11:34

Эмммм. А кто подскажет. На Denwer капча работает нормально, а вот на сервере (CentOS)Apache не рисуется! В чем проблема и как можно исправить?!




Alek Veritov    03.03.09 23:31

to CaTacLYSM: проверяйте правильность установки GD библиотеки на сервере




Smile42RU    19.07.09 17:41

Alek, молодец!) Кульный скрипт




Сергей    08.08.09 13:30

У Вас очень простые и талантливые идеи, спасибо. Вашу captcha прикрутил на свой сайт.
До этого использовал вот это:
http://recaptcha.net/plugins/php/
Идея там конечно хорошая, но это использование стороннего API, а это не всегда показано и слишком уж наворочено. Если надо создать лишнею проблему пользователю, то да, если надо создать некое препятствия для спам ботов, то не подойдет. Идеален в этом случаи Ваш скрипт.
Не могли бы Вы ответить мне на вопрос: как Вы отлаживаете javascript скрипты? Так смотришь скрипт, вроде все элементарно, как начнешь отладку, так темный лес. По этому, по возможности, все реализую в "серверном варианте" на PHP, по крайней мере методом "научного тыка" (ошибки ведь сразу видно) удается более менее быстро написать скрипт. Хотя возможностей того же PHP стало не хватать и надоело воровать чужие скрипты на javascript.
C уважением Сергей http://tuapse24.ru




Динар    28.10.09 16:01

А есть небольшая проблема с Кешированием. У меня почему-то сессии не совпадают немного. И когда неправильно введен код, то шаблонизатор заново отображает функцию, например, регистрации, а там код тот же, что и до этого. И при этом дико несоответствуют сессии друг другу. Запаздывают примерно на одно обновление. Как это можно исправиль. Прошу прощения за сумбур.




Alek Veritov    28.10.09 22:53

добавляй случайный GET параметр к ссылке, что-нибудь типа
/captcha.php?rand=1234, чтобы браузер и прокси не кешировали.




Andy    07.11.09 01:16

Здравствуйте !
Не совсем мне понятно, пожалуйста объясните пожалуйста для тех кто в танке, для чего надо стартовать новую сессию, если старт таковой уже прописан в Вашем скрипте...
пробовал считывать переменную таким образом как написано выше:
if($_SESSION['secpic'] == strtolower($_POST['pic']))
получал неправильный ответ иди Unknow wariable _SESSION['secpic']




Alek Veritov    07.11.09 01:41

Сессию, конечно, надо только один раз стартовать там, где это логично. Скрипт из архива можно использовать "как есть", поэтому там сессия стартуется.
Если получаете неправильный ответ, а особенно Unknow wariable - включайте error_reporting(E_ALL) и проверяйте правильно ли стартована сессия там, где это получаете.




Макс    29.11.09 03:06

Не получается, прошу разобраться.
В начале файла с формой ставлю старт сессии, но при вызове изображения переменная сессии не хочет запоминаться. Не могли бы вы выложить и примерный простой текст фала формы. Тоесть вы тут выложили пример но не полностью и поэтому применяя свою форму что-то да не получается.




Андрей    19.01.10 20:33

Картинки замечательные. К генератору никаких замечаний, всё работает, однако передачу значения кода с картинки через переменную сессии осуществить не удалось. Если можете, разъясните подробнее на рабочем примере "Форма+капча+обработчик формы и кода"




Андрей    19.01.10 21:52

Таки заработало!
1. Включить куки (не уверен что нужно, но читал. что без этого может не работать);
2. Удалить из браузера всю историю, куки, посещённые адреса, кеш, можно отключить кеширование страниц и т.д.(пароли оставляем:));
3. session_star() пишем как в обработчеке формы, так и в скрипте генерации изображения.
4. Открываем "почищенный" браузер, а лучше какой-нибудь свежеустановленный альтернативный и пробуем там - должно заработать!




Serega    17.04.10 15:34

Здравствуйте!
Сделал все как тут, картинка генерируется, но проблема вот в чем:
путаюсь на той же странице вывести из сессии ТЕКСТ картинки, а он выводит почему то СТАРЫЙ, а не тот который сейчас на картинке. Да и еще при первом запуске браузера он вообще бьет ошибку на строку вывода, а когда обновляю страницу то уже выводит. но выводит текст с предыдущей картинки.




Serega    17.04.10 15:35

А вот код, как я это делаю:
<p>
<img src="secpic.php" alt="защитный код">
<?php
$a = $_SESSION['secpic'];
echo $a;
?>
</p>




Александр    12.06.10 07:28

У меня проблемка, скрипт иногда выводит на картинку одно, а в переменную сессии другое, в чём может быть дело?
Кэширование точно не причем. После чистки всего, кэша, истории и кук, тестил на чистом браузере...




anonymous    07.07.10 15:25

День добрый!
Присоединяюсь к Александру. Тоже самое. Бьюсь второй день. Есть несовпадение с тем, что на картинке и с тем, что выводит $_SESSION['secpic']. В этой сессионной переменной почему то всегда значение которое было на предыдущей капче. Самое интересное что значения $_SESSION['secpic'] в скрипте моем, куда вставлена проверка и в скрипте который строит саму капчу (тот что в шапке этой статьи) РАЗНЫЕ. я это выяснил, когда добавил отсылку значения $_SESSION['secpic'] к себе на е-майл. Получилось что $_SESSION['secpic'] внутри скрипта построения капчи имеет ВЕРНОЕ значение (что и на текущей картинке), а при проверке и вызове этой переменной в своем скрипте, НЕВЕРНОЕ (предыдущее значение капчи). Помогите разобраться пожалуйста!




Set    31.08.10 09:45

Скрипт и капча просто супер. Что бы все заработало нужно в принимающем файле вписать следующее.
$a = $_SESSION['secpic'];
$a = strtolower($a);
$b = $_POST['test'];
$b = strtolower($b);
$b = trim($b);
echo "В переменной а содержится: ".$a;
echo "<br>";
echo "В переменной b содержится: ".$b;
echo "<br>";
if ($a == $b)
{
echo "куль"; }
else {
echo "некуль";
}
?>
<br><br><br>
<form name="news" method="post" action="hello.php">
<img src="blocks/secpic/secpic.php" alt="защитный код" /><br>
<input type="text" name="test">

<input type="submit" name="Submit" value="Изменить">
</form>




Александр    08.10.10 19:45

Цитата: "У меня проблемка, скрипт иногда выводит на картинку одно, а в переменную сессии другое, в чём может быть дело?"

Извиняюсь забыл уточнить, када писал это сообщение, что использовал русский алфавит, и вот он та даёт осечку такого типа. Как мне кажется эта проблема кроется в генераторе картинки. Где буквы в цикле перебираются.

При использовании английских символов осечек нету, у меня точно.

Set, на счёт вашего варианта попробую, может сканает :)

В чём суть моей проблемы, я хочу замутить капчу на русском, пока не решил проблему...




Марьян    10.11.10 13:59

Здравствуйте. У меня возникла такая вот проблемка. На денвере все хорошо скрипт отрабатывается и картинка выводиться, а при переносе на хостинг скрипт перестает генерировать изображение. Подскажите плиз в чем это может быть проблема.




Галина    11.12.10 14:53

У меня вообще выводится только альтернативный текст - подключиться к файлу никак не может




Андрей    03.01.11 17:16

Подскажите как сделать поле куда вписывать код




Беломор    06.02.11 21:22

Хорошая капча. Автору спасибо!




Jasperio    31.03.11 00:26

Как обновить картинку с новым кодом капTча ?




MS    08.04.11 23:20

Чтобы обновить изображение:

<span id="captcha"><img onclick="reload(); return false;" src="sec_pic.php" alt="защитный код" style="cursor:pointer;" /></span>

<script language="javascript" type="text/javascript">
function reload () {
var random_value = new Date().getTime();
document.getElementById('captcha').innerHTML = '<img onclick="reload(); return false;" src="sec_pic.php" alt="защитный код" style="cursor:pointer;" />';

};
</script>




ICEBERG    22.04.11 02:27

Аналогичная проблема с сессией.
Переменная сессии показывает предыдущее значение с картинки.




MS    24.04.11 11:33

в каптче сессия должна стартовать session_start();
а также сессия должна стартовать в Вашем php скрипте session_start();

в скрипте - обработчике сравниваем значения
$_SESSION['secpic'] и $_POST['captcha']

if ($_POST['captcha'] != $_SESSION['secpic'] OR !$_SESSION['secpic']) echo 'error';
else echo 'good';




Дмитрий    28.04.11 16:46

Как перегрузить средствами php или js исходный файл(secpic.php), чтобы тот файл к которому прикручена капча не перегружался. Попробовал функцию в сообщении от 08.04.11 - не работает.




MS    30.04.11 16:03

не дописал 1 строку, чтобы работало нужно заменить в сообщении от 08.04

<img onclick="reload(); return false;" src="sec_pic.php" alt="защитный код" style="cursor:pointer;" />

на

<img onclick="reload(); return false;" src="sec_pic.php?random_value=' + random_value + '" alt="защитный код" style="cursor:pointer;" />




Дмитрий    06.05.11 14:57

Автору - опишите пожалуйста как Вы реализовали проверку на ввод защитного кода "Неправильный защитный код!".




wcb-tezarius    14.05.11 14:33

Неплохо было бы автору обновить исходник и код вверху добавив к нему предоставленную возможность обнавления (очень полезная штука) но всеравно обоим авторам спс за скрипт




Серей    16.05.11 05:32

Отличный скрипт, спасибо.




Mihail Zimbru    04.06.11 22:28

Privet Alek, deistvitelno tvoi skript o4eni horoshii, genialnii i prostoi :). Spasibo bolishoe, ia nemnoshko ego dorobotal zdelav ego dinami4nee. Kak mne postaviti zdesi moiu dorobotku?




Раиса    06.06.11 23:08

Картинка красивая, но выложите, кто-нить, пож., полностью работающую капчу с проверкой введенного кода и обновлением капчи.
Сенкс!




http://displanet.ru/    29.06.11 12:59

Вот тоже пример хороший
http://displanet.ru/blog/13-php-sluchaynoe-izobrazhenie.html




Кишин    05.07.11 14:12

Вообще неработает, непонятно, у меня фотрма работает вообще то даже если я вообще не введу код с картинки
о_______________________О
помогите :(




Alex    11.07.11 01:19

Не работает, на картинке и в переменной разные символы...:((




Zakhar    25.08.11 13:45

Символы на картинке и в переменной разные пока вы сеанс не перезапустите,т.к. в том же сеансе данные извлечь нельзя.
Сделал свой вариант, капчу сделал ф-цией которая сразу возвращает значение кея и сохраняет картинку в гифку (имя картинки регеню по ид сессии), когда надо ф-ция вызывается, потом картинка вставляется и значение кода сразу известно.




Sanchezzz T    14.09.11 08:07

Спасибо то что нужно я немного переделал его
//набор символов
$letters = "aeioubcdfghjklmnpqrstvwxyz0123456789";
//а строку где идет выборка символов
//случайный символ
$letter = $letters{rand(0,strlen($letters)-1)};

а так то то нужно сэкономило мне время, не потомучто это сложно просто это готовое решение мне понравилось

Спасибо автор!




TEZARIUS    18.10.11 10:27

Такой вопрос:
как можно увеличить контрастность выводимых символов на картинке
к примеру символы в фоне покрасить черным цветом а нужные для проверки сделать поярче




Alek Veritov    19.10.11 10:03

Цвета букв задаются как RGB тремя числами от 0 до 255. Для фона они выбираются случайно в строке 20, для основных задаются варианты потемнее в строке 11. И то и другое, естественно, можно поменять.




pan_fx    16.11.11 04:42

Спасибо хороший скрипт!




Алексей    29.11.11 16:56

Спасибо! Целый день искал наконец нашел, установился без проблем




Алексей    29.11.11 17:00

Можно еще и фон поменять, супер то что надо




Саша    26.12.11 00:19

Обалденный скрипт :))) Спасибо большое автору, все просто и без гемороя!!! и главное работает :))




Kapust    26.12.11 15:12

Применил данный пример, очень доволен, спасибо.

Заставить работать обновление картинки из постов от 08.04.11 и 24.04.11 не получилось
Зато я сочинил еще один похожий вариант с использованием библиотеки jQuery, который заработал у меня:

<div class='captcha'>
<img onclick='reload()' src='secpic.php'>
</div>

function reload() {
$(".captcha").empty();
$("<img onclick='reload()' src='secpic.php?"+ new Data().getTime() +"'/>");
}




kapust    26.12.11 15:15

Блин криво скопировался текст, в последней строке функции надо добавить аппендТу:

$("<img onclick='reload()' src='secpic.php?"+ new Data().getTime() +"'/>").appendTo(".captcha");




Black Diamond    26.01.12 00:20

Автор, большие благодарности за код! Работает идеально. Просто, стильно и со вкусом! Кликнул по рекламе :)




От человека    27.02.12 16:50

Fatal error: Call to undefined function imagecreatetruecolor() in F:serverwwwtestcommentssecpic.php on line 14
В моем php что нету такой функции?




От человека    27.02.12 16:59

ну так и было, GD2 не было подключено! Спасибо за скрипт!




Виталий    03.03.12 21:12

в сессии находится предыдущие значение картинки,как быть?
только сравниваю не с с элементом массива post а то что введено в строку




Константин    27.03.12 10:31

Прекрасный скрипт. Но при использовании все равно валила куча спама пока в сессии не начал передавать не сам код в открытом виде, а md5 хэш. Видимо спам боты могут считывать переменные из сессии.




от меня    15.05.12 14:58

Скрипт супер, спасибо, единственный трабл, ввожу все правельно, а пишет Регистрация невозможна: код подтверждения введен не верно
Из-за чего это?




Mark    17.05.12 22:19

Вот тут по проще капча с исходниками и фоновым рисунком:
http://lifeexample.ru/php-primeryi-skriptov/kapcha-na-php.html




Добрый дядя    19.05.12 14:32

Классные статьи на сайте! Через рекламу - спасибо:)






Если вам помогла или просто понравилась эта статья вы можете отблагодарить автора кликнув по рекламе. Спасибо!





комментировать:
прежде чем писать комментарий убедитесь, пожалуйста, что он не попадает в нижеследующие категории:
  • не стоит писать "я чайник, помогите ..." или "я начинающий, объясните ..." - уважайте себя! может вы и новичок, но ведь не тупой же! сами вполне способны во всем разобраться, тем более, что материал здесь изложен весьма доступно

  • не пишите вопросы типа "как мне сделать такую же менюху как наверху?", "куда вставлять этот код?", "как устроен интернет?" и т.д. - уважайте время автора!

  • комментарии вида "все, что здесь написано - бред" будут оставлены только если будут подписаны "я такой-то, разработчик сайта такого-то с посещаемостью 1000 хостов в день" и т.п. Если вы не согласны с чем-то - обоснуйте, напишите как правильно, а писать простые ругательства не надо, это не забор

прямые оскорбления кого бы то ни было будут удалятся!
здоровая критика приветствуется!



от кого:  

security picture