2 Варіанта капчи для сайту

У цьому уроці ми навчимося писати власну капчу, навіть в двох варіантах, яка буде не надто складною, зручною для користувача і, разом з тим, досить ефективною.

План уроку:

1. Постановка завдань (8:01)

2. Алгоритм капчи №1. Починаємо реалізацію (14:56)

3. Реалізуємо капчу з математичним виразом (12:03)

4. Реалізуємо капчу питання-відповідь (17:49)

1. Постановка завдання

Отже, давайте трохи поговоримо про капчі. Як вже говорилося, якщо ми розмістимо на сайті звичайну форму зворотного зв'язку, то незабаром нашу пошту завалять сотні спамових листів з пропозицією купити одну непотрібну річ і в подарунок отримати ще більш непотрібну річ або щось типу того. Найчастіше весь процес у спамерів автоматизований, тобто Чи не вони ходять по сайтам і заповнюють своїм спамом контактні форми, а за них це роблять спеціально написані скрипти (спамові боти). Саме тому наша форма потребує якоїсь захисту від автоматичного заповнення, тобто необхідна перевірка на людяність заповнює.

Для того, щоб не відправляти повідомлення, заповнені ботами придуманий не один спосіб. Напевно, найпершим і найбільш відомим є CAPTCHA (абревіатура, що позначає приблизно наступне - "автоматизований тест для розрізнення комп'ютерів і людей") ... але разом з тим - це самий незручний для користувача варіант (на мій погляд). Думаю, багато хто стикався із заповненням капчи - іноді доводиться буквально "розшифровувати" її, гадаючи - що ж це за символ? Начебто розшифрував, вводиш ... отримуєш повідомлення, що заповнене невірно ... починаємо заново наші потуги на терені дешифрування ... іноді взагалі методом тику здогадуєшся, що розробники саме цієї капчи враховують ще і регістр символів, але при цьому, ні слова не сказали про це ... з'являється при це стійке бажання назвати таких розробників нехорошим словом.

Та й до того ж на сьогодні капча не є вже надійним захистом від автоматичного заповнення форми або автоматичної реєстрації - боти "розумнішають" і часто можуть розпізнавати її (з власного досвіду: на форумі зі стандартною капчі, який ставив для однієї фірми, в день було до 10 автоматичних реєстрацій, відповідно, приблизно стільки ж непотрібних тим, після заміни капчи на антибот типу "питання-відповідь" боти більше не реєструвалися) ... крім того, існують навіть ресурси, які наймають клікерів, щоб ті працювали на благо спа меров - вводили символи з капчі.

Загалом, традиційна капча не найвдаліший варіант. Сьогодні є куди більш надійні засоби перевірки на людяність, які, до того ж, набагато зручніше для користувача.

Ось деякі варіанти, які, на мій погляд, з успіхом можуть конкурувати з традиційною капчі:

1. порахувати результат складання (або іншого математичного дії) двох випадкових чисел;

2. дати відповідь на просте запитання, типу "Назва нашої планети";

3. зняти / встановити галочку в чекбоксі;

4. клікнути по певній зображенні з ряду запропонованих.

Думаю, на цьому з вступною частиною можна закінчити і переходити до створення алгоритму та його реалізації.

2. Алгоритм капчи №1. починаємо реалізацію

Щоб згенерувати числа ми скористаємося функцією rand (), що генерує випадкове ціле число в заданому діапазоні. Над кодом форми відкриємо конструкцію PHP і приступимо до кодування:

Отже, в змінних $ a і $ b у нас тепер є випадкові числа від 1 до 10. Крім того, ми відкрили сесію функцією session_start (). Думаю, Ви здогадалися для чого нам це потрібно. Адже ми повинні десь зберігати результат складання двох чисел після відправки даних з форми в обробник, а найпростіше зробити це використовуючи механізм сесій. Створимо сесійний змінну і дамо їй результат математичної операції - у мене це буде складання:

Залишилося вивести для користувача згенеровані числа в потрібному місці форми:

Тепер ми можемо зробити проміжне тестування вже написаного. Для цього після старту сесії напишемо наступний код:

Що означають ці рядки коду?

Перш за все, першою умовою ми перевіряємо чи існує елемент submit в глобальному масиві POST. Це робиться для того, щоб перевірити чи була натиснута кнопка форми - кнопка має ім'я submit, тому-то ми і перевіряємо саме наявність цього елемента в POST-даних. Отже, якщо була натиснута кнопка, то буде виконуватися код в операційних дужках, інакше - цей код буде пропускатися. Ну а в операційних дужках ми також поставили умову. Цим умовою ми, власне, і порівнюємо те, що отримали від користувача, з тим, що у нас зберігається в сесійному змінної $ _SESSION [ 'res']. Якщо обидва значення збігаються - перевірка пройдена і буде виведено "OK", інакше - перевірка на людяність не пройдена.

Отже, для початку ми напишемо код для блоку інакше (else), який спрацьовує в тому випадку, якщо перевірка не пройдена. Що нам потрібно зробити в цьому випадку? Потрібно згенерувати 2 нових числа і повідомити користувачеві, що він не пройшов перевірку. Для всього цього нам знадобиться повністю перезавантажити сторінку - в цьому нам допоможе функція header () - і створити нову сесійний змінну, в яку будемо записувати повідомлення для користувача про успіх чи невдачу.

Тепер залишилося вивести значення змінної $ _SESSION [ 'mes'] в потрібному місці, наприклад, під формою. Також ми повинні відразу ж разрегістріровать цю сесійний змінну, оскільки її значення повинно виводитися тільки 1 раз і після оновлення сторінки її бути не повинно.

Під формою напишемо код:

Тепер при тестуванні написаного, якщо ми невірно відповімо на перевірочне вираз, то буде виведено повідомлення "Дан невірну відповідь!", Тобто спрацює, як і повинно, блок інакше. Якщо відповідь буде вірний - спрацює блок умова, але, так як він поки що порожній - нічого виводитися не буде. Тепер займемося відправкою листа в блоці умови.

3. Реалізуємо капчу з математичним виразом

Лист формується за допомогою функції mail (), а потім його відправляє поштовий сервер. Ця функція має 3 обов'язкових аргументу:

2. $ subject - тема повідомлення;

3. $ body - тіло повідомлення.

Також є ще один необов'язковий, але вкрай бажаний аргумент, в якому можна вказати дополнітельнвий службові дані, наприклад, кодування, в якій поштовій програмі необхідно відкривати лист (інакше лист буде відкрито в кодуванні, встановленої за замовчуванням для поштової програми).

Створимо 4 змінні і функцією mail () сформуємо лист вже готове для відправки:

Трохи пояснимо код.

Таким чином, перша капча нами реалізована. Тепер приступимо до реалізації другої.

4. Реалізуємо капчу питання-відповідь

У цій капчі у нас буде база питань і відповідей на них (питань може бути як завгодно багато). Користувачеві буде запропоновано відповісти на випадково вибране запитання. Ну а далі все йде за тим же алгоритмом, що і в попередній капчі. Таким чином, наша задача створити базу питань-відповідей і випадковим чином вибрати питання. При цьому в сесійний змінну необхідно записати відповідь на це питання, щоб потім порівняти його з відповіддю користувача.

Для наших цілей створимо новий файл (наприклад, index2.php), в який скопіюємо код з попереднього файлу. Внесемо мінімальні правки в створений файл: змінимо всюди редирект на поточний файл (index2.php) і видалимо рядки з генеруванням чисел і записом результату складання в сесійний змінну.

Тепер створимо базу питань-відповідей. Зберігати їх можна, наприклад, в БД, в текстовому файлі або будь-якому зручному сховище інформації. Виберемо для цих цілей масив. Масив буде багатовимірним - кожен елемент створеного масиву буде також масивом, елементами якого, в свою чергу, буде питання і відповідь. На місці генерування чисел створюємо масив з необхідними даними - у мене буде 3 пари питання-відповідь (Ви можете зробити таких пар набагато більше - все обмежено лише Вашою фантазією). Звертаю увагу на те, що всі відповіді повинні бути записані в нижньому регістрі:

Тепер для того, щоб вивести на екран, припустимо, питання "Цар звірів" - нам достатньо звернутися до масиву $ question таким чином:

Тобто ми звертаємося спочатку до елементу з ключем 1 - це масив з потрібним питанням -, а потім до питання, яке має ключ 0. Звернемо увагу, що всі питання у вкладених масивах мають однаковий ключ - 0, а всі відповіді - 1. Таким чином, для випадкового вибору питання досить згенерувати перший ключ (в нашому випадку це буде число від 0 до 2). Для цього створимо змінну $ key і в неї помістимо сгенерированное число в заданому діапазоні - це і буде перший ключ:

Тут ми вказали, як і належить, два параметра для функції rand (). З мінімумом зрозуміло - це нуль (нумерація елементів масиву за замовчуванням починається з нуля). Другий параметр можна було вказати явно - 2. Але тоді наш скрипт трохи втратив би в універсальності - адже якщо зміниться кількість питань, то доведеться міняти і максимум до функцій. Щоб кількість питань вважалося автоматично, скористаємося функцією count () - вона вважає кількість елементів масиву. У нашому випадку функція поверне 3 (3 елементи в масиві). Але останнє запитання має ключ 2, а тому ми віднімемо від результату, який поверне функція count () одиницю і отримаємо потрібний результат.

Залишилося запам'ятати відповідає обраному питання відповідь. Перший ключ у нас є, а другий завжди дорівнює 1 для відповідей:

Тепер виведемо вибране запитання в потрібному місці форми:

Власне, друга капча вже практично готова і можна її вже протестувати. Залишилося дописати пару невеликих дрібниць. Пам'ятаємо, що важливо було писати все відповіді в нижньому регістрі. Це зроблено неспроста - ми ж не знаємо, в якому саме вигляді отримаємо від користувача відповідь, скажімо на питання "Назва нашої планети" ... це може бути така відповідь - "Земля", а може бути і такий - "Земля". Ці відповіді не ідентичні. Відповідно, ми повинні зробити їх ідентичними для скрипта. А зробити це зовсім нескладно. Досить навести відповідь користувача до нижнього регістра, в чому нам допоможе функція strtolower (). Також, на всякий випадок, можна обрізати прогалини з обох кінців отриманої від користувача рядки (робиться це на випадок, якщо користувач випадково ввів разом з відповіддю пробіл). Обрізати прогалини з початку і кінця рядка допоможе функція trim (). Внесемо відповідні зміни в рядок коду, де перевіряється збіг отриманого від користувача з тим, що є у нас:

висновок

От і все. Обидві наші капчи реалізовані і готові до використання на сайті і, як уже зазначалося, на мій погляд, ці капчи набагато ефективніша за традиційну капчи. На цьому наш урок завершено. Удачі в Ваших проектах і до нових зустрічей!

Найсвіжіші новини IT і веб-розробки на нашому Telegram-каналі

Так в тому то весь і сенс, що клієнтська частина не призначена для таких речей, як капча
Сенс клієнтської частини в поліпшенні юзабельності, а перевірки / захист потрібно покладати тільки на серверну частину. Боту і не потрібно нічого робити з клієнтською частиною, він її просто прибере з вихідного коду. Наприклад, для відправки даних на сервер необхідно, щоб всі поля були заповнені. Поки вони не заповнені JS блокує кнопку відправки. Відмінно! Ми беремо вихідний код форми, прибираємо весь JS з нього і вільно відправляємо дані на сервер.
Ну і: «Якщо на сайті використовується« унікальна »капча, тобто та яка не стоїть на популярних движках і т.д. то спамеру немає сенсу розробляти бота під неї, адже кругом повно інших сайтів які він може пройти »... ось це в точку. Це те, про що говорилося щодо співвідношення мета / засоби. Писати окремого бота під унікальну капчу (а це аж ніяк не рядок на шумовий картинці) занадто дороге рішення, яке може бути виправдано тільки відповідною метою.
А так, дійсно повно сайтів, блогів, форумів, на яких стоїть звичайна капча в початковій її реалізації ...
так навіщо платити більше?

З приводу JS, ось якщо робити допустимо при кліці на певну кнопку, типу «Я не бот», брати і дописувати в action форми додатковий параметр або встановлювати приховане поле певне значення. Адже тоді бот не зможе клікнути на кнопку і ці дані не будуть передані. А можна ж форму надсилати через AJAX, і ні як інакше. Для бота адже це буде трудомістким завданням?

якщо ефективне рішення в цьому випадку проти спаму?

Шановна починаюча, якщо Ви взагалі не розбираєтеся в PHP, то краще взяти капчу простіше - з математичним виразом.
Тільки заради Вас скачав по посиланню гостьову, з тим, щоб підказати алгоритм рішення. Отже, в файлі addrec.php спочатку встановлено порожнє значення для змінної $ error. Ця змінна є своєрідним прапором: якщо після всіх перевірок вона залишиться порожньою - додаємо запис в файл, інакше - щось не влаштувало нас.
Відповідно, в форму необхідно додати поле для введення результату математичного виразу, а потім, отримавши результат цього поля з форми, порівняти з тим, що зберігається в сесії (не забуваємо відкривати сесію). Якщо результати не співпадуть - запишемо відповідне повідомлення в змінну $ error, блокуючи таким чином додавання повідомлення. От і все

Дякуємо, але навряд чи мені це допоможе. Попередня капча не протримався й місяця, так що просту математичну комусь також не лінь буде розкрити і знову доведеться витратити багато часу на пошуки іншого варіанту. Питання-відповіді принаймні можна додавати і змінювати, і спамеру набридне заходити весь час на сайт і міняти питання. Думаю, що в моєму випадку виходом буде прикрити гостьову книгу до кращих часів.