吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1358|回复: 11
收起左侧

[求助] flask项目中邮箱验证码的唯一性问题。

[复制链接]
关山月明 发表于 2021-2-23 11:43
各位大佬们,小弟不才,想要请教大家一个问题。
就是在flask项目中,我写了一个发送邮箱验证码的问题,之前本来准备使用封装好的flask-mail发送,在我的项目中出现循环导包的问题,我也懒得解决这个。一气之下就使用的自带stmplib模块,邮件是可以发送成功的。
但是,我几天测试的时候发现一个问题,就是我通过chrome浏览器注册用户发送邮箱验证码之后(使用Ajax获取邮箱传到后台),我在我手机上打开这个网页,用这个验证码也能注册成功。

这是处理验证码的视图函数,请大家帮忙看看问题。
我首先定义了验证码全局变量
# 验证码变量
verifycode = None

# 发送邮件
@user_bp.route('/send_email', methods=['POST'])
def send_email():
    email = request.form.get('email')
    smtp_obj = smtplib.SMTP_SSL('smtp.qq.com'.encode(), 465)
    smtp_obj.login('**********@qq.com', "qq邮箱授权码")
    global verifycode
    verifycode = str(uuid.uuid4()).split('-')[0]
    # 邮件正文
    msg = MIMEText('<h2>心念念的验证码已经来到你的身边啦^_^</h2><hr><h4 style="color:red"><b>{}<b></h4>'.format(verifycode), 'HTML', 'utf8')
    msg['From'] = Header('naimei', 'utf8')
    msg['To'] = Header('flask project', 'utf8')
    msg['Subject'] = Header('验证码')
    smtp_obj.sendmail('*********@qq.com', [email], msg.as_string())
    smtp_obj.quit()
    return 'success'



然后在注册的视图函数中接收这个验证码。
# 注册页面
@user_bp.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        repassword = request.form.get('repassword')
        email = request.form.get('email')
        code = request.form.get('verifycode')      
        global verifycode
        if password == repassword and verifycode == code and len(username):
            user = User()
            user.username = username
            user.password = generate_password_hash(password)
            user.email = email
            # 添加数据
            db.session.add(user)
            # 提交数据
            db.session.commit()
            session['uid'] = user.id

            return redirect(url_for('user.index'))
        return render_template('/user/register.html', msg='出现空内容!')
    elif request.method == 'GET':
        return render_template('/user/register.html')


这种思路是我自己寻思出来的,但是今天测试的时候发现了 这个bug,冥思苦想不知道怎么解决,请大佬们赐教。






发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

as614001 发表于 2021-2-23 11:58
现成的轮子你不用~
a952135763 发表于 2021-2-23 11:58
我不太懂flask框架哈  
以我的直觉来说 verifycode 不应该是全局变量
web框架应该都有 session保存数据
你看下这方面的文档使用session保存你的verifycode 就行了
 楼主| 关山月明 发表于 2021-2-23 12:02
as614001 发表于 2021-2-23 11:58
现成的轮子你不用~

flask-mail主要是导包问题,试了好几种方法,提示我循环导包问题,难以解决
as614001 发表于 2021-2-23 12:02
global verifycode  这就是原因。无论哪个用户都能使用这个global。将他转为唯一的就可以了。
 楼主| 关山月明 发表于 2021-2-23 12:03
a952135763 发表于 2021-2-23 11:58
我不太懂flask框架哈  
以我的直觉来说 verifycode 不应该是全局变量
web框架应该都有 session保存数据

你的意思是每进入send_mail函数都设置一个session么,然后进入到register函数后,在验证是否是同一个session。这么说来好像是可以的
 楼主| 关山月明 发表于 2021-2-23 12:05
as614001 发表于 2021-2-23 12:02
global verifycode  这就是原因。无论哪个用户都能使用这个global。将他转为唯一的就可以了。

那应该怎么解决呢,如果不设置global,函数内部会自动创建一个局部变量,修改不到外面的verifycode了啊。没有思路
晚空 发表于 2021-2-23 12:06
楼上说的对,用session存验证码。或者就是用用数据库暂存验证码。


as614001 发表于 2021-2-23 12:12
关山月明 发表于 2021-2-23 12:05
那应该怎么解决呢,如果不设置global,函数内部会自动创建一个局部变量,修改不到外面的verifycode了啊。 ...

verifycodedic={} 每次生成验证码,把唯一性 如 提交注册的uuid session 以字典添加进来  verifycodedic[uuid]=verifycode;  在验证的时候记得获取就可以了。上线后记得加条定时清理 verifycodedic
as614001 发表于 2021-2-23 12:13
或者自己jia到session中去 如 session[verifycode]=code
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 06:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表