Python中使用SMTP安全吗?脚本输入密码是否存在泄露风险?
该Python SMTP邮件脚本密码安全性分析
你提供的代码如下:
username = input("Type your e-mail and press enter: ") password = input("Type your password and press enter: ") s = smtplib.SMTP('smtp-mail.outlook.com', port=587) s.ehlo() s.starttls() s.ehlo() s.login(username, password) s.set_debuglevel(1) msg = MIMEText("""body""") sender = 'my_mail@hotmail.com' recipients = ['recipient@hotmail.com'] msg['Subject'] = "Hello" msg['From'] = sender msg['To'] = ", ".join(recipients) s.sendmail(sender, recipients, msg.as_string())
基础安全性结论
你当前脚本的传输层安全性是达标的:使用了SMTP 587端口+STARTTLS加密逻辑,密码在网络传输过程中是加密状态,不会被网络中间节点明文窃取。
但脚本仍然存在多处密码泄露风险,需要重点留意:
存在的密码泄露风险点
- 终端输入明文回显:你用了默认的
input()函数输入密码,输入过程中密码会以明文形式显示在终端屏幕上,身边有人或者终端被远程投屏时会直接泄露密码,建议替换为getpass模块的getpass()方法,输入时不会回显字符。 - 调试模式泄露认证信息:代码中
s.set_debuglevel(1)会将所有SMTP交互细节完整打印到控制台,其中就包含登录阶段经过Base64编码的用户名和密码,而Base64是可逆编码,拿到编码内容可以直接解码得到明文密码,生产环境运行必须删除该行或者将调试等级设为0。 - 终端/进程日志泄露风险:如果运行脚本的终端开启了操作日志记录、或者脚本本身有全局变量打印逻辑,你输入的
password变量内容可能会被持久化存储到日志文件中,后续如果日志文件被无关人员获取就会导致密码泄露。 - 主密码权限过高风险:当前脚本使用的是邮箱的主登录密码,一旦密码泄露,攻击者可以直接登录你的整个邮箱账户,访问所有历史邮件、关联服务,风险远高于使用邮箱服务商提供的应用专用密码(仅允许SMTP发信权限,无法登录邮箱网页端/客户端)。
- 公共环境运行风险:如果在共享服务器、公共办公设备、未做安全加固的设备上运行该脚本,输入的密码可能会被键盘记录器、同设备的高权限进程窃取。
额外安全注意事项
- 不要为了方便将密码硬编码到脚本文件中,一旦脚本文件被误传、泄露,密码会直接暴露。
- 收件人、发件人地址如果涉及敏感信息,也不要硬编码到可公开访问的代码仓库中。
- 运行脚本的设备建议定期查杀恶意程序,避免键盘记录、内存窃取类木马窃取输入的密码。
内容的提问来源于stack exchange,提问作者nostres
相关产品推荐
相关产品推荐

