Я написал статью Как послать Емайл с домашнего веб-сайта, где описал основной принцип отправки электронной почты с помощью SMTP сервера GMail, но ничего не сказал о защите от спама.
Теоретически если спамбот найдет нашу страницу Contact, то он может выделить из нее реквизиты емайл формы, и спаммер станет слать нам кипы мусора, прямо через URL:
http://mysexysite/cgi-bin/sendmail.py?name=Вася Пупкин&from=vasqpupkin@mail.ru&subject=Грязный спам&message=Читай блог Мисс Трамел и станешь дураком
Мы этого естественно не хотим.
Мы обезопасим себя тем, что:
- спрячем HTML в Питонный код
- сделаем картиночную кэпчу
- будем вручную блокировать спаммеров
Программный код вместо HTML
Предположительно спамботам труднее ориентироваться в программном коде, чем в чистом HTML.
HTML
Python
Не совсем одно и то же.
Картиночная кэпча
Кэпча генерирует код, который показывается юзеру в виде картинки, чтоб он подтвердил его вручную. Если юзерский инпут не совпадет с кодом на сервере, письмо не отправляется. Картинка измалевана точками, чтоб спаммерские программы OCR не распознали текст, и зашифрована кодировкой Base64, чтобы бот не скачал ее по URL.
Ручной антиспам
Сервер генерирует ряд заголовков, которые могут идентифицировать спаммера:
REMOTE_ADDR | IP, с которого осуществлен запрос на наш сайт. |
HTTP_USER_AGENT | Программа, с которой осуществлен запрос на наш сайт. У спаммеров агенты смешно называются: BlackWidow, ChinaClaw, Go!Zilla, Mister, Papa, Zeus и тд. |
HTTP_REFERER | Домен, с которого произошел запрос на наш сайт. В идеале это должен быть наш домен, потому что подразумевается, что посетители нашего сайта будут слать нам письма с нашего сайта, а не с Лубянки или Огарева 6. |
Мы атрибуты надоедливого товарища положим в файл, который будет проверяться перед каждой отправкой послания, и, если спаммер там, то емайл не отправится, хотя умник не заметит ничего подозрительного, поскольку страница перезагрузится, как обычно. Мы ему не скажем, чтоб он и дальше думал, что самый умный.
Стирание HTML тагов
Некоторые еще советуют стирать HTML таги из письма, но я не вижу в этом особого смысла. Просто получишь спам без тагов, только и всего. Если спаммера блокировать на основе тагов, тогда и сам не пошлешь никакой ссылки. Впрочем, смотрите сами.