【问题标题】:Changing user's password using Flask and SQLite使用 Flask 和 SQLite 更改用户密码
【发布时间】:2021-06-25 21:23:11
【问题描述】:

我正在尝试实现更改用户密码的功能。我只在数据库中存储哈希而不是密码,我想要求用户先输入旧密码,然后再输入新密码。我想检查旧密码的哈希是否与存储在数据库中的密码匹配,如果是,则用新密码对其进行更新。我做错了,因为代码未通过验证检查,并且出现错误:“密码无效”。 任何帮助,将不胜感激。

@app.route("/change_password", methods=["GET", "POST"])
@login_required
def change_password():

    user_id=session["user_id"]

    if request.method=="POST":

        password = request.form.get("password")
        hash = generate_password_hash(password)
        new_password = request.form.get("new_password")
        confirm_new_password = request.form.get("confirm_new_password")
        new_hash = generate_password_hash(new_password)
        #Validations:
        if not password:
            return apology("must provide password", 400)


        if not new_password:
            return apology("must provide a new password", 400)


        #Ensure password confirmation is provided
        if not confirm_new_password:
            return apology("must confirm new password", 400)
        #Check if new password matches
        if new_password!= confirm_new_password:
            return apology("password does not match", 400)
        # Query database for the current password
        rows = db.execute("SELECT * FROM users WHERE hash = ?", hash)

        # Ensure username exists and password is correct
        if len(rows) != 1:
            return apology("invalid password", 400)
        #Update DB with the new_hash
        else:
            db.execute ("UPDATE users SET hash=:new_hash WHERE id=:id", new_hash = new_hash, id = user_id)
        return redirect("/")

    else:
        return render_template("change_password.html")

【问题讨论】:

    标签: python sqlite flask


    【解决方案1】:

    你的代码有很多问题...

    最大的问题

    rows = db.execute("SELECT * FROM users WHERE hash = ?", hash)
    

    您必须搜索用户名,而不是哈希!!!想象一下,两个用户的密码相同,或者一个用户输入了错误的密码,但那是另一个用户的密码……

    我从未使用过直接访问 sqlite,仅通过 sqlalchemy,但快速查看文档(https://docs.python.org/3/library/sqlite3.html#sqlite3.Cursor.executemanydb.execute 不返回例如行,但你需要查询它。

    例如在您的db.execute 之后,您需要执行db.fetchonedb.fetchall,请参阅上面的链接文档。

    此外,您的代码顺序还可以改进。

    例如首先,您生成新密码的哈希,然后检查是否有密码 - 这应该切换。

    说到验证,大部分都可以通过例如flask-wtforms,所以你自己不需要那么多验证码。

    【讨论】:

      猜你喜欢
      • 2016-09-11
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 2018-02-23
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多