Python email.errors.HeaderParseError:标头值似乎包含嵌入的标头:
我正在尝试使用office api使用soap消息还原邮件,但对于某些邮件,它给出了“header value似乎包含嵌入的header”错误。 例如 正在以email.errors.HeaderParseError:标头值的形式引发错误 似乎包含嵌入的标题:'me@locmsglhost\NSObject:注射受试者的 但是如果我把msg['From']改为Python email.errors.HeaderParseError:标头值似乎包含嵌入的标头:,python,security,mime-types,code-injection,Python,Security,Mime Types,Code Injection,我正在尝试使用office api使用soap消息还原邮件,但对于某些邮件,它给出了“header value似乎包含嵌入的header”错误。 例如 正在以email.errors.HeaderParseError:标头值的形式引发错误 似乎包含嵌入的标题:'me@locmsglhost\NSObject:注射受试者的 但是如果我把msg['From']改为 'hello\r man: man' 'tya: Hello' 'push@#$\r\nPus' 'Hello \n\r Pushpa:
'hello\r man: man'
'tya: Hello'
'push@#$\r\nPus'
'Hello \n\r Pushpa: World'
'@\r\nhello : World'
然后它就如预期的那样工作了
可能的原因是什么?存在哪些漏洞
在mime消息中是否会出现错误
你不能随意使用任何标题,这是禁止的 如中所述 异常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(没有空格的键):
,因此\nhello:
已通过,但未通过\nhello:
您不能按需使用任何头,这是禁止的
如中所述
异常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\u):
,因此\nhello:
通过了,但没有\nhello:
,但对于“877-237-1843\n密码:4607”、“时间:2014年4月10日上午10:00\n地点:西棕榈滩”、“Anoka桩中心”\n6:30和7:30pmCT”等情况,它正在崩溃“5月1日,星期二上午8:10-8:40,校友礼堂”。但它是这样输入的--“hello\r男:男”tya:hello“push”$\r\nPus“hello\n\r Pushpa:World”@\r\nhello:World。我不理解这种模式,他们在检查它时使用的规则或正则表达式是什么?但对于像“877-237-1843\n密码:4607”这样的情况,它正在被打破“,”时间:2014年4月10日上午10:00:00\n地点:西棕榈滩“,”Anoka Stack Center\n6:30和7:30pmCT“,”以及“5月1日星期二上午8:10-8:40,校友礼堂”。但是它在这样的输入下工作--“hello\r man:man”tya:hello“push@#$\r\nPus”hello\n\r Pushpa:World“@\r\nhello:World”。我不理解这个模式,他们检查的规则或正则表达式是什么?