0

在烧瓶应用程序中,我正在向用户发送电子邮件:

msg = MIMEMultipart('alternative')
msg['Subject'] = 'About resetting your password'
...
reset_key = os.urandom(64).encode('base64')
link = request.host_url + "reset_pwd?rk=" + reset_key
html = '<html><body><a href="' + link + '">Reset password</a></body></html>'
part = MIMEText(html, 'html')
msg.attach(part)
...
server = smtplib.SMTP(mail_server)  
server.starttls()
server.login(mail_username, mail_password)
server.sendmail(mail_username, to_addr, msg.as_string())
server.quit()

但是,reset_key 有斜线和其他非安全字符。所以我做了

link = request.host_url + "reset_pwd?rk=" + flask.escape(reset_key)

但是当我检查我的电子邮件时,不知何故链接被破坏了,也许没有逃脱。如何正确转义文本?

编辑:更正了代码中的错字。

4

3 回答 3

1

如果您使用 gmail,您可以打开电子邮件子菜单并单击Show original或设置 smtp 调试级别smtp.set_debuglevel(1)并查看真实的电子邮件内容。

最好不要escape用于随机字符串,因为它只是转义下一个字符,"'&<>请参阅https://github.com/mitsuhiko/markupsafe/blob/master/markupsafe/_speedups.c#L33并且没有理由使用escape字符串base64,因为没有什么可以逃脱的。还escape返回Markup对象并更好地str(flask.escape(reset_key))处理这种情况。

我使用下一个代码生成唯一链接:

def get_restore_key():
    chars = string.ascii_letters + string.digits
    return ''.join(random.choice(chars) for i in xrange(64))
于 2013-08-22T12:47:35.000 回答
0

您在发布的代码中关闭a tag了一点。

尝试html = '<html><body><a href="' + link + '">Reset password</a></body></html>'

于 2013-08-22T10:55:02.957 回答
0

使用 urllib.quote(),而不是 flask.escape():

link = request.host_url + "reset_pwd?rK=" + urllib.quote(reset_key)
于 2013-08-23T00:25:04.083 回答