Достаточно полное описание протокола POP3

19 декабря 2009

Как и обещал, продолжаю публиковать описания различных сетевых протоколов. Поскольку в прошлый раз мой пост был о протоколе SMTP, логично продолжить тему об электронной почте.

Протокол POP3 (Post Office Protocol — version 3, третья версия протокола почтового отделения) является наиболее распространенным протоколом получения электронной почты с почтового сервера. Для этих целей также используется IMAP. В IMAP предусмотрено больше возможностей, чем в POP3, но зато POP3 намного проще. Для сравнения — POP3 описан в RFC1939, занимающем всего 20 страниц, а RFC3501, описывающий IMAP, состоит из целых 108 страниц. В этом посте речь пойдет о протоколе POP3.

Как всегда, начнем с запуска утилиты telnet и живого примера:

telnet mail.nic.ru 110
Trying 194.85.88.226...
Connected to mail.nic.ru.
Escape character is '^]'.
+OK POP3 Server ready <31226791.1261208975@fcgp01.nicmail.ru>
APOP user@nic.ru d0a42277e0dc30b9cbc8295653928dca
+OK 5 messages (868540 bytes) (proxing)

Здесь мы соединяемся с pop3-сервером, работающим обычно на 110-м порту и проходим аутентификацию (не путать с авторизацией). Если в приветствии сервера присутствует похожая на e-mail строка в треугольных скобках (timestamp), значит сервер поддерживает команду APOP, позволяющую передавать пароль в зашифрованном (точнее — хэшированном) виде. В этом примере хэш вычислен следующим образом:

echo -n "<31226791.1261208975@fcgp01.nicmail.ru>qwerty" | md5

То есть происходит конкатенация timestamp с паролем, а от результата вычисляется MD5. Преимущество этого метода в том, что даже при использовании незащищенного соединения злоумышленник не сможет перехватить пароль. Он увидит только хэш, который будет совершенно бесполезен, поскольку для каждого нового соединения сервер использует уникальный timestamp. Чтобы узнать пароль необходимо взломать хэш c помощью перебора, что практически бесполезно для достаточно сильных паролей, которые к тому же меняются хотя бы раз в пол года.

Недостаток метода в том, что на стороне сервера пароли приходится хранить в открытом виде, иначе как проверить правильность хэша, переданного пользователем? Если злоумышленник получит доступ к базе данных, то сможет украсть все пароли.

Потому большинством почтовых сервером (я лично проверил pop3.mail.ru:110 и pop.gmail.com:995/ssl/) команда APOP не поддерживается и проходить аутентификацию приходится с помощью стандартной пары логин:пароль.

USER user@nic.ru
+OK please send the PASS
PASS qwerty
+OK 5 messages (868540 bytes) (proxing)

Очевидно, предпочтительнее использовать этот метод в связке с зашифрованным соединением, чем команду APOP. В случае, если аутентификация не будет пройдена, мы получим сообщение типа

-ERR Go away!

Итак, аутентификация пройдена, теперь можно выполнить несколько команд. Начнем с нескольких довольно бесполезных команд:

HELP
+OK Valid commands: QUIT, NOOP, STAT, LIST, UIDL, DELE, RSET, RETR, ...
NOOP
+OK cool
LAST
+OK 5 is last seen

Команда HELP позволяет получить список поддерживаемых сервером команд. В этом примере команды UIDL, XTND и XMIT являются расширениями протокола POP3 и сервер не обязан их поддерживать. Команда UIDL позволяет получить уникальные идентификаторы сообщений (см описание команды LIST ниже):

UIDL
+OK 6 messages
1 3876
2 3877
3 3878
4 3879
5 3880
6 3881
.
UIDL 2
+OK 2 3877

Для чего нужны XTND и XMIT не знаю и разбираться лениво :) Желающие могут поискать ответ в Google.

Команда NOOP означает «ничего не делать». На ум приходит только одно ее применение — выполнять команду раз в 15 секунд, чтобы дать понять серверу, что клиент не повис.

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

Теперь перейдем к более полезным командам:

STAT
+OK 5 868540
LIST
+OK 5 messages
1 275368
2 11196
3 153304
4 275367
5 153305
.
LIST 2
+OK 2 11196
TOP 2 0
+OK message follows
Return-Path: <spammer@example.ru>
X-Blacklisted-By: cbl.abuseat.org
From: "=?koi8-r?B?48XO1NIg7cnH0sHDyck=?=" <spammer@example.ru>
To: user@nic.ru
Subject: =?koi8-r?B?SGVsbG8=?=
Date: Thu, 17 Dec 2009 18:18:12 +0300
MIME-Version: 1.0
Content-Type: multipart/related;
        type="multipart/alternative";
        boundary="----=_NextPart_000_003C_01CA7F45.01CA7F45"
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.3790.3959
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.3790.4325
Received-SPF: none
X-Spam-Rating: 83.69

.
DELE 2
+OK marked deleted

Команда STAT позволяет определить количество сообщений в почтовом ящике (5) и их суммарный размер (868 540 байт).

Команда LIST показывает нам список идентификаторов сообщений и их размер в байтах. Заканчивается список точкой. В качестве аргумента этой команде можно передать id сообщения, тогда в ответ мы получим размер только этого сообщения.

Команда TOP позволяет получить заголовок сообщения (первый аргумент команды — id сообщения) и первые N строк тела сообщения (второй аргумент команды). В этом примере я указал N=0, потому что хотел посмотреть только заголовок сообщения. С тем же успехом можно было просто указать только один аргумент. Заканчивается ответ сервера также точкой. Команда TOP часто используется почтовыми клиентами для того, чтобы определить отправителя и тему сообщения без необходимости скачивать письмо целиком. Это экономит время и трафик пользователя.

Очевидно, тут мы имеем дело со спамом (см e-mail отправителя, X-Blacklisted-By и X-Spam-Rating), так что можно смело удалить сообщение, даже не скачивая его целиком. Для этого используется команда DELE. Сообщение будет помечено на удаление, но стерто только после того, как мы закроем соединение.

Отменить удаление всех помеченных нами сообщений можно командой RSET. Получить сообщение целиком можно с помощью команды RETR <id-сообщения>. Как и в случае с TOP, конец сообщения обозначается точкой. Не буду приводить примеры этих команд, так как тут все довольно очевидно.

По завершению работы можно попрощаться с сервером и закрыть соединение:

QUIT
+OK CommuniGate Pro POP3 Server connection closed

Вот и все, что я хотел рассказать о протоколе POP3. Надеюсь, что вы нашли данную информацию полезной.

Метки: , .


Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.