Я хотів би розглянути використання бібліотеки Zend_Captcha_Image окремо від ZendFramework або інших його компонентів. Це дозволить використовувати бібліотеку в будь-проектах, які не привносячи при цьому зайвого коду і не ускладнюючи структуру програми.
В інтернеті є достатня кількість подібних публікацією, з тією лише різницею, що всі вони розглядають Zend_Captcha_Image в тандемі з Zend_Form, а я, як вже було написано вище, хотів би уникнути цього. Одна причина, як мінімум, у мене є. Наприклад, неодноразово доводилося впроваджувати захисне зображення в CMS, де спочатку воно відсутнє. Зрозуміло, що форми, для яких використовувалася captcha, створювалися штатними засобами CMS і задіяти Zend_Form було або неможливо, або безглуздо.
Власне, чому саме Zend_Captcha_Image? Якщо вам доводилося вивчати ринок CMS, то ви не могли не помітити, що в більшості двигунів захисне зображення каптчі має абсолютно однаковий вигляд. Дуже велику популярність завоювала бібліотека, яка поширюється сайтом captcha.ru. У підсумку, дана каптча прекрасно розпізнається будь-яким спам ботом, що робить її абсолютно марною.
Може бути моя писанина про Zend_Captcha_image хоч кого-то наштовхне на думку піти трохи далі в пошуку рішення проблеми захисту сайту від спаму.
Для роботи Zend_Captcha_image потрібно наявність GD адекватної версії. Це не повинно бути проблемою, проте, якщо щось не буде працювати, переконайтеся, що GD присутній (дивіться в phpinfo).
Перш за все, давайте витягнемо з ZendFramework потрібні нам бібліотеки. На жаль, взяти тільки одну Zend_Captcha_image не вийде, так як вона має ряд залежностей, до числа яких належить інтерфейс для роботи з сесіями, Zend_Loader і виключення. Це такі файли:
Спочатку напишемо скрипт, який буде малювати картинку, створювати сесію та інше подібне.
Щоб скрипт був трохи більш цікавим, я вирішив, що буде вельми непогано малювати картинку різними шрифтами. Це ще дещо ускладнить відгадування нашої каптчі. Список шрифтів зберігається в масиві $ fontsBase. Природно, що найкраще використовувати якісь екзотичні шрифти і уникати застосування загальнодоступних системних.
Далі підключаємо саму бібліотеку і створюємо об'єкт. Щоб не іклудіть все залежності вручну, я просто додав шлях до директорії з ZF в include_path. Стандратною практика при використанні більшості фреймворків.
Після створення об'єкта, задаємо настройки захисного зображення. Імена методів говорять самі за себе. Залишається пояснити лише значення Zend_Captcha_Image :: setTimeout (). Даний метод задає час життя сесії, іншими словами, за відведений нами кількість секунд, користувач повинен буде вже якось подужати заповнення форми. Інакше йому доведеться повторити пароль кожного разу, так як колишній стане недійсним. Думаю, 10 хвилин буде достатньо більш, ніж достатньо.
При таких налаштуваннях, ми отримаємо приблизно наступне зображення:
Також зауважте, що директорія, що задається в Zend_Captcha_Image :: setImgDir () повинна існувати і бути доступна для запису. У неї буду поміщатися згенеровані зображення. Про очищення переживати не варто, це буде відбуватися автоматично.
В останньому рядку коду ми отримуємо ID сесії, який за сумісництвом є ім'ям згенерованого файлу зображення. Зберігаємо в змінної для подальшого використання в html формі.
З формою все банально.
Поле captchaCode призначене для введення тексту з захисного зображення. У прихованому полі captchaId передаємо ID сесії на скрипт, який здійснює валідацію форми.
Валідатор форми. Перевірка captcha коду
Тут все також просто. За вже знайомою схемою підключаємо потрібну бібліотеку, в даному випадку для роботи з сесіями, отримуємо дані потрібної сесії і виконуємо перевірку введеного з зображення коду.
Про додаткові параметри, які можна задати для генерованого зображення Captcha, ви можете прочитати в офіційному керівництві по адептер до Zend_Captcha. Їх там залишилося небагато.
Якщо підібрати гарні шрифти, встановити пристойний рівень шуму, то вийде гарна протекція від спаму в формах. Головне, не забувайте, що крім роботів, вашу форму захочуть заповнити і люди. Не робіть код з картинки нечитабельним. Найбільше дратує, коли неможливо розібрати символи на каптч, а отже правильно їх ввести.
Також викладаю архів зі скриптами, про які тут йшлося. Zend_Captcha_Image_source