email.errors.HeaderParseError: значение заголовка содержит встроенный заголовок: - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь восстановить почту, используя мыльные сообщения, используя офисные API, но в некоторых сообщениях выдается сообщение об ошибке «значение заголовка содержит встроенный заголовок».например.

msg = MIMEMultipart()
msg['From'] = 'me@locmsglhost\r\nSubject: injected subject'
msg.as_string()

выдает ошибку как email.errors.HeaderParseError: значение заголовка содержит встроенный заголовок: 'me @ locmsglhost \ nSubject: вставленная тема'

Но если я изменяю msg ['From'] на

'hello\r man: man'
'tya: Hello'
'push@#$\r\nPus'
'Hello \n\r Pushpa: World'
'@\r\nhello : World'

, тогда он работает, как и ожидалось.

Какие могут быть возможные причины и какие уязвимости могуттам быть в сообщении пантомимы?

1 Ответ

0 голосов
/ 15 октября 2018

Вы не можете использовать любой заголовок как хотите, это запрещено.

Как указано в Документация ,

исключение email.errors.HeaderParseError

... когда делается попытка создать заголовок, который, кажется, содержит встроенный заголовок (то есть существует то, что должно быть строкой продолжения, которая не имеет начальных пробелов и выглядит какзаголовок).


Почему это опасно и с ним нужно обращаться хорошо?

Сначала вы можете прочитать это , это простой пример того, как можно осуществить атаку по SMTP-заголовку.

Вы можете спросить, как это можно сделать?Я имею в виду, что вы никому не позволяете редактировать свой бэкэнд, верно?

Давайте представим, что для вашего приложения может быть какое-то поле, введенное пользователем, например 'message',

msg['message'] = 'abc' #Entered by user

Этохорошо, но что, если

msg['message'] = 'abc\r\nreplyTo:attacker@hello.com'
#or
msg['message'] = 'abc\r\nTo:attacker@hello.com'

Атакующий может легко переопределить вашу электронную почту для отправки спама.Вот почему он делает проверку за вас.


Вы можете даже проверить, безопасен ли заголовок, по

email.header.Header('string')

Давайте посмотрим, как библиотека электронной почты pythonвыполните проверку.

Поиск в исходном коде Lib/email/header.py

В ln50-52:

# Find a header embedded in a putative header value.  Used to check for
# header injection attack.
_embedded_header = re.compile(r'\n[^ \t]+:')

Вы можете попробовать это, все, например, выпредоставленный может передать его, кроме того, который вы указали.

Поскольку структура заголовка электронного письма всегда \n(key_without_space):, поэтому \nhello : пройдено, но не \nhello:.

...