首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我把自己和验证搞混了。我试图创建一个登录/注册表函数,但发现很难验证数据库中的登录详细信息

我把自己和验证搞混了。我试图创建一个登录/注册表函数,但发现很难验证数据库中的登录详细信息
EN

Stack Overflow用户
提问于 2019-04-24 02:27:13
回答 1查看 46关注 0票数 0

我试图在python中使用tkinter创建一个登录/注册表函数,但将自己与通过登录函数进行验证搞混了。它应该与数据库连接,并查看字段是否正确,但我不知道如何操作。

代码语言:javascript
复制
def login_verify():
    global c

    with sqlite3.connect('database.db') as db:
        c = db.cursor()

    username1 = username_verify.get()
    password1 = password_verify.get()
    username_login_entry.delete(0, END)
    password_login_entry.delete(0, END)

    finduser = ('SELECT * FROM Users WHERE username =? AND password =?')
    c.execute(finduser,[(username1),(password1)])
    results = c.fetchall()
    if results:
        login_sucess()

    else:
        password_not_recognised()
        user_not_found()

def login_success():
    global login_success_screen
    login_success_screen = Toplevel(login_screen)
    login_success_screen.title("Success")
    login_success_screen.geometry("150x100")
    Label(login_success_screen, text="Login Success").pack()
    Button(login_success_screen, text="OK", command=delete_login_success).pack()

def password_not_recognised():
    global password_not_recog_screen
    password_not_recog_screen = Toplevel(login_screen)
    password_not_recog_screen.title("Success")
    password_not_recog_screen.geometry("150x100")
    Label(password_not_recog_screen, text="Invalid Password ").pack()
    Button(password_not_recog_screen, text="OK", command=delete_password_not_recognised).pack()


def user_not_found():
    global user_not_found_screen
    user_not_found_screen = Toplevel(login_screen)
    user_not_found_screen.title("Success")
    user_not_found_screen.geometry("150x100")
    Label(user_not_found_screen, text="User Not Found").pack()
    Button(user_not_found_screen, text="OK", command=delete_user_not_found_screen).pack()

当使用不正确的密码登录时,它应该运行函数'password_not_recognised‘

当使用不在数据库中的详细信息登录时,它应该运行'user_not_found‘

当细节正确时,它应该运行login_success ()

EN

回答 1

Stack Overflow用户

发布于 2019-04-24 03:06:47

我宁愿让你自己完成这项任务,所以我将介绍基本原理:

您已经使用了准备好的语句,这是很棒的,如果使用得当,它可以防止sql注入攻击。尽管您不应该将密码以明文形式存储在数据库中。使用hashlib模块并将密码的散列与存储在数据库中的密码的散列进行比较。

  • 用户名字段应该是唯一的主键,因此表中只有一行应该包含给定的用户名。

应该对查询数据库的方式进行两个更改:

  1. 查询不应在where语句中同时包含用户名和密码字段。这是因为您无法确定查询失败是否是因为用户不存在或密码不匹配
  2. 使用cursor.fetchone获取用户行并将其存储在变量中。如果不是None,则表示用户存在,并继续进行密码验证。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55817320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档