Довго думав, чи варто розповідати, але вчора ввечері у мене з'явилося трохи вільного часу, і я все-таки вирішив продовжити свій цикл статей про маленькі проблеми у великих проектах. Та й, можливо, про це вже і так всі знають, а я даремно хвилююся.
Всі ми знаємо сервіс reCaptcha, який пару років тому придбала компанія Google. Ми бачимо його в багатьох великих проектах, наприклад, при реєстрації в LceJournal. Треба сказати, що я люблю качати файли списком прямо зі свого сервера, і коли на одному з сайтів, з якого я періодично щось викачую, з'явилася така штука, мене стало це трохи дратувати. Коли мені щось не подобається, я не опускаю руки, а намагаюся придумати спосіб як цього уникнути.
Так я вирішив побороти reCaptcha і думаю, що у мене це вийшло...
Починаючи аналіз, насамперед, я задаюся питаннями. Яка найбільша проблема такого великого проекту? Швидше за все, це зберігання дуже великої кількості непотрібної інформації, статусів і дій. ReCaptcha повинен створити токен, перевірити його і деактивувати.
Якщо перші дві дії можна замінити шифруванням (без зберігання), то з деактивацією трохи складніше. А ще сервісу треба виконувати свою «основну» функцію сканування документів. Де все це зберігати? Дуже хочеться заощадити на цьому. І, зазвичай, в цьому і криється найбільша помилка розробників.
Як працює reCaptcha:
- Сервіс запитує у вас два слова, якщо йому подобається, те, що ви відповіли, вам видається токен.
- У токені зашитий тимчасовий обмежувач
- Після запиту на перевірку з сайту токен деактивується і вдруге ним скористатися не можна.
Саме в цих двох останніх пунктах і виявилося слабке місце. Відомо, що сервіс обмежує дію токена приблизно п'ятьма годинами. Але, як я з'ясував, reCaptcha не зберігає весь цей час ваш активований токен, а, схоже, веде лист блокування і видаляє токен з нього приблизно через десять хвилин неактивності. Тобто, якщо ви десять хвилин не намагалися активувати цей токен ще раз, то він видаляється з аркуша блокування. Таким чином, за п'ять годин одним єдиним токеном можна скористатися до тридцяти разів, тут головне проявити терпіння і не смикати його раніше десятихвилинного інтервалу.
Як це використовувати? Дуже просто! Створивши 10 токенів, можна активувати дію на сайті щохвилини протягом п'яти годин автоматично. 300 активацій всього за 10 токенів. По-моєму дуже хороша пропозиція. Більше токенів - частіше активації.
На жаль, на сайті reCaptcha (Google Code) я не знайшов жодного слова про цю проблему. Однак є дуже простий спосіб від неї захиститися, достатньо зберігати активовані токени (recaptcha_challenge_field) на боці сайту п'ять годин. Адже ймовірність видачі точно такого ж токена за цей час практично дорівнює нулю.
Зазвичай мої пости супроводжуються невеликим прикладом використання вразливості, але цього разу я вирішив, що буде досить просто розповісти. Допитливий розум% username% зможе сам перевірити працездатність цього методу.






