2013-08-22 74 views
0

在燒瓶應用的文字,我將電子郵件發送到用戶:逃生與flask.escape

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) 

但是,當我檢查我的電子郵件,以某種方式鏈接被打破,也許不能逃脫。如何正確地轉義文本?

編輯:更正了代碼中的錯字。

+0

我只是添加評論在這裏,我有與flask.escape有一些奇怪的行爲。它不僅修改字符串以轉義字符,還修改字符串,以便在添加更多字符時,即使不希望這些字符轉義,它們也會自動轉義。因此,我使用這裏的代碼進行基本轉義:https://wiki.python.org/moin/EscapingHtml – Soferio

回答

0

二手urllib.quote()的flask.escape而不是():

link = request.host_url + "reset_pwd?rK=" + urllib.quote(reset_key) 
+0

在Python3中,如果其他人想知道它是'urllib.parse.quote'。 – Sam

0

您在發佈的代碼中稍早關閉了a tag

嘗試html = '<html><body><a href="' + link + '">Reset password</a></body></html>'

+0

對不起,這是一個錯字,我原來的代碼沒有這個錯字。所以我會更新我的問題。 – synergetic

1

如果您使用Gmail,您可以打開電子郵件子菜單,然後單擊Show original或設置SMTP調試級別smtp.set_debuglevel(1),看看真實的電子郵件內容。

最好不要使用escape隨機字符串,因爲它只是逃避下一字符"'&<>看到https://github.com/mitsuhiko/markupsafe/blob/master/markupsafe/_speedups.c#L33並沒有理由使用escapebase64字符串,因爲沒有什麼逃跑。此外,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))