gpt4 book ai didi

Python smtplib 和清理

转载 作者:行者123 更新时间:2023-12-01 05:04:13 28 4
gpt4 key购买 nike

我正在使用 smtplib 的非常基本(几乎完全是 from the docs )的用法。从 Bottle FormsDict 检索主题和消息使用 request.forms.get(),然后使用此代码通过电子邮件发送出去。

msg = MIMEText(message)
msg['Subject'] = subject
msg['From'] = config['from_email']
msg['To'] = config['to_email']
s = smtplib.SMTP('localhost')
s.sendmail(config['from_email'], [config['to_email']], msg.as_string())
s.quit()

我习惯于清理 XSS 等用户输入(通常只是依靠 Jinja2 的魔力)。在这种情况下,我应该做什么,我只通过电子邮件发送用户的输入?会存在什么样的漏洞?

最佳答案

我现在正试图弄清楚自己,我可以告诉你的一件事是,你绝对应该使用 email.header.Header检测 header 注入(inject):

from email.header import Header
>>> Header('Test').encode()
'Test'
>>> Header('Test\n').encode()
'Test'
>>> Header('Test\nTest2').encode()
'Test\nTest2'
>>> Header('Test\nFrom').encode()
'Test\nFrom'
>>> Header('Test\nFrom:').encode()
(...)
HeaderParseError: header value appears to contain an embedded header: 'Test\nFrom:'

另请检查this回答,我想我同意,如果输入有潜在危险,你应该拒绝它,因为这可能意味着有人试图做一些粗略的事情。

编辑:

事实证明,MIME 消息会自行验证 header ,即使您不使用 email.header.Header ,并且还很好地对正文进行了编码:

>>> msg = MIMEText('something\r\nsomething2', 'plain', 'UTF-8')
>>> msg.as_string()
'MIME-Version: 1.0\nContent-Type: text/plain; charset="utf-8"\nContent-Transfer-Encoding: base64\n\nc29tZXRoaW5nDQpzb21ldGhpbmcy\n'
>>> msg['From'] = 'me@localhost\r\nSubject: injected subject'
>>> msg.as_string()
(...)
HeaderParseError: header value appears to contain an embedded header: 'me@localhost\nSubject: injected subject'

您可以在Is there any injection vulnerability in the body of an email?找到更多可能的注入(inject)。 .

所以我想说,您不必做任何特别的事情来保持安全,因为:

  • 默认情况下会检测 header 注入(inject),因此黑客无法通过弄乱subject的值来添加 header 。
  • 正文经过编码/引用,因此如果存在任何可能破坏某些内容的邪恶字符序列,则应将其消除
  • 即使正文没有被编码,我认为造成伤害的唯一方法是改变消息结构,例如:注入(inject) MIME 边界(对于多部分消息;例如: https://bugzilla.mozilla.org/show_bug.cgi?id=600464 )。但边界是一个长随机字符串,因此可能更容易猜测您的银行密码。
  • <CRLF>.<CRLF>序列terminates message body但这不是问题,因为 MIME 类用 LF 替换 CRLF:

    >>> MIMEText('something\r\n.\r\nsomething2', 'plain', _charset='iso-8859-1').as_string()
    'Content-Type: text/plain; charset="iso-8859-1"\nMIME-Version: 1.0\nContent-Transfer-Encoding: quoted-printable\n\nsomething\n.\nsomething2'

关于Python smtplib 和清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25404563/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com