Сэнди небезопасен: как не внедрять 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.

Теперь мы знаем стандартную форму подписки:

  1. Имеет работающую валидированную реализацию reCAPTCHA на стороне сервера (я ее тестировал).
  2. Использует официальный 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 самостоятельно, чтобы исправить это:

  1. Откройте subscribe.php в корневом каталоге вашей установки Sendy.
  2. Найдите, где происходит проверка reCAPTCHA. Для меня (Sendy v4.0.3.1) это началось с этой строки кода:
if($recaptcha_secretkey!='')

3. Переместите весь блок операторов if за пределы $subform проверки. Вот как для меня выглядел результат:

Вы также можете связаться со мной, если у вас есть проблемы с защитой формы подписки Sendy, и я сделаю все возможное, чтобы помочь.

В заключение,

Пожалуйста, не внедряйте reCAPTCHA таким образом.

Первоначально опубликовано на https://victorzhou.com.