Сэнди небезопасен: как не внедрять reCAPTCHA
Реализация reCAPTCHA Сэнди ничего не делает.
РЕДАКТИРОВАТЬ: Мы сделали это - Сэнди выпустил патч (v4.0.3.3) для этой проблемы! Я рекомендую выполнить обновление, если вы столкнулись с проблемой. Спасибо Сэнди за быстрый ответ на этот пост в блоге, а также спасибо всем читателям, которые помогли в этом.
Несколько месяцев назад я переключился с Mailchimp на Sendy, альтернативу автономной рассылке новостей по электронной почте. Я написал целый пост о том, почему я перешел с Mailchimp на Sendy, но суть в том, что Mailchimp слишком быстро стал слишком дорогим.
С тех пор я в целом доволен Сэнди. Пока однажды не случилось это:
Сэнди считает эти адреса электронной почты разными, но на самом деле они в значительной степени дубликаты из-за уловки периода Gmail. Это означает, что на эти адреса электронной почты приходили все мои электронные письма (в том числе с двойным подтверждением) несколько раз, что для меня является простым способом сообщить о спаме.
Этот инцидент, наконец, побудил меня инвестировать в защиту своей электронной рассылки (что мне действительно следовало бы сделать в первую очередь). К счастью для меня, Sendy имеет встроенную поддержку reCAPTCHA v2! Я думал, что это будет легко настроить, но по какой-то причине я не мог заставить его работать с моей специальной формой подписки, поэтому я обратился к Сэнди за помощью:
Вот что он ответил на следующий день:
Мне запомнилась эта строчка:
Невозможно реализовать reCAPTCHA Google в API.
Это не может быть правдой - в документации reCAPTCHA есть специальный раздел Проверка на стороне сервера!
Я провел дополнительное исследование стандартной формы подписки Сэнди, пытаясь понять, что имел в виду Бен. Вот сокращенная версия HTML за этой формой:
Первое, что я заметил, это значение атрибута action
формы: https://sendy.victorzhou.com/subscribe. Интересно, что это точный URL-адрес, по которому находится официальный Sendy API.
Теперь мы знаем стандартную форму подписки:
- Имеет работающую валидированную реализацию reCAPTCHA на стороне сервера (я ее тестировал).
- Использует официальный API подписки Sendy.
Эти два факта опровергают это утверждение:
Невозможно реализовать reCAPTCHA Google в API.
Кроме того, почему Бен сказал мне, что reCAPTCHA «вступит в силу для стандартных форм подписки, которые предоставляет Sendy, а не для API подписки»?
Вы замечали раньше строку 11? Почему официальная форма Sendy должна включать жестко заданное поле subform
, которое не задокументировано в Sendy API?
Ага, вы (возможно) догадались. Поле subform
включает проверку reCAPTCHA на стороне сервера. Если в этом поле не задано значение yes
, серверная reCAPTCHA полностью отключена.
Я немедленно отправил то, что нашел Бену:
Его ответ оказался не тем, на что я надеялся:
Oh no. 🤦🏻♂️
Остальная часть этой электронной почты никуда не денется. Вот почему я пишу этот пост - пожалуйста, исправьте эту проблему, Бен!
Давай, Виктор, неужели это так важно?
да. Вспомните эту цитату из моего последнего электронного письма Бену:
Какая польза от reCAPTCHA, если любой, у кого есть компьютер, может за 5 минут написать сценарий, чтобы спамить ваш список рассылки тысячами поддельных подписок?
Хорошо, это немного преувеличено (вам, очевидно, понадобится некоторый опыт программирования / веб-разработки), но я придерживаюсь этого мнения. Позвольте мне доказать вам это.
Вот сценарий Node.js, который рассылает рассылку рассылки Sendy:
Это 7 строк кода для рассылки любого количества подписок на рассылку спама. Чтобы проверить это, я настроил тестовый список на своей фактической учетной записи Sendy, включил для него reCAPTCHA, используя мои настоящие ключи reCAPTCHA, и запустил скрипт.
Работает. Если вы в настоящее время используете реализацию Sendy reCAPTCHA, теперь вы знаете: она не делает то, что вы думаете.
Так как же защитить свой список рассылки ?!
Что ж, в идеале Сэнди выпустил бы патч, исправляющий эту проблему. Тогда вам просто нужно будет обновить установку, и все готово! Если вы столкнулись с проблемой Sendy, вы можете помочь, отправив электронное письмо на адрес [email protected] и попросив установить исправление. Не стесняйтесь ссылаться на этот пост в качестве ссылки - чем больше поддержки мы получим, тем лучше.
Если Sendy не выпустит исправление в ближайшее время, вот как вы можете изменить установку Sendy самостоятельно, чтобы исправить это:
- Откройте
subscribe.php
в корневом каталоге вашей установки Sendy. - Найдите, где происходит проверка reCAPTCHA. Для меня (Sendy v4.0.3.1) это началось с этой строки кода:
if($recaptcha_secretkey!='')
3. Переместите весь блок операторов if
за пределы $subform
проверки. Вот как для меня выглядел результат:
Вы также можете связаться со мной, если у вас есть проблемы с защитой формы подписки Sendy, и я сделаю все возможное, чтобы помочь.
В заключение,
Пожалуйста, не внедряйте reCAPTCHA таким образом.
Первоначально опубликовано на https://victorzhou.com.