Как SMTP экранирует команду RSET после команды DATA?

В RFC 821 говорится, что команда сброса (RSET) может быть отправлена ​​после команды DATA и отправлены некоторые почтовые данные:

Однако чем отличается почтовый клиент, отправляющий команду RSET после DATA, и сообщение, содержащее слово «RSET» в отдельной строке?

Я также проверил RFC 5321 и не вижу ничего, что могло бы смягчить или избежать этого. Он действительно говорит об экранировании почтовой строки, которая начинается с «.», Но не «RSET».

Клиент не может прекратить передачу почтовых данных с точкой в ​​строке сам по себе, или сервер отправит частично полученное письмо.

Я полагаю, что есть что-то, что я пропустил в RFC, иначе я не могу избавиться от мысли, что либо во многих реализациях существует вектор атаки внедрения команды SMTP, либо никто никогда не сможет отправить письмо с «RSET» в отдельной строке (Думаю, люди заметили бы).

Отправка электронной почты с помощью Python менее чем за 1 минуту
Отправка электронной почты с помощью Python менее чем за 1 минуту
Отправка электронной почты с помощью Python - это удобный способ автоматизировать процесс отправки электронных писем. Это может быть полезно для...
2
0
748
2

Ответы 2

Я считаю, что ключевое слово здесь - после. Команда DATA выполняется до тех пор, пока она не завершится с одиночным . в строке.

Правильный. После запуска команды DATA вы не можете прервать ее, кроме как разорвать соединение.

jstedfast 18.12.2018 15:31

Достаточно справедливо, за исключением того, что в RFC для RSET указано, что «Все сохраненные данные об отправителе, получателях и почте должны быть отброшены». Если RSET не может использоваться между DATA и ., а . завершит почтовую транзакцию и отправит почту, в какой ситуации RSET когда-либо будет иметь почтовые данные, которые нужно отбросить?

Trevor 18.12.2018 15:39

Вероятно, поэтому этот отрывок был удален из 5321. Вы заметите, что 5321 косвенно заменяет 821 (через 2821).

tripleee 18.12.2018 15:42

@tripleee - RFC 5321 § 4.1.1.5 (RSET) заявляет, что «любые сохраненные отправитель, получатели и почтовые данные ДОЛЖНЫ быть отброшены», чтобы они, по крайней мере, там остались. См. Также мой ответ.

Adam Katz 18.12.2018 19:32

В RFC 5321 § 4.1.1.5 (RSET) указано, что «любые сохраненные данные об отправителе, получателях и почте ДОЛЖНЫ быть отброшены». Это относится к командам MAIL FROM, RCPT TO и, предположительно, DATA.

Однако после приема ., следующего за DATA, сообщение «ДОЛЖНО» быть доставлено (что может привести к сбою, но не к частичному отказу, см. § 4.1.1.4). Это очищает буфер от всего, что должен делать RSET.

Это означает, что RSET просто вызывает ответ 250 OK от принимающего сервера (keep-alive, очень похоже на NOOP) и подтверждает отправителю, что действительно нет сохраненного отправителя или получателя в очереди для следующего сообщения.

Я не знаю, как прервать команду DATA для выдачи RSET. Единственный известный мне способ сделать это - разорвать соединение и установить новое - и, чтобы быть в безопасности в случае какой-то нечетной возможности возобновления, я бы выпустил RSET сразу после EHLO или HELO (который В спецификации указано, что это NOOP). Если бы такой способ был, он должен быть в RFC 5321 § 4.1.1.4, § 4.1.1.5 и / или § 3.3.

Другие вопросы по теме