我正在尝试轻松登录,并且有一个标题为“用户”的表格。我正在尝试从POST正文中获取登录信息,并在整个数据库中对其进行验证。
来自表单的值:
user = request.form['username']
password = request.form['password']
SQL语句:
conn = sqlite3.connect(db)
cur = conn.cursor()
cur.execute("SELECT * FROM Users WHERE Username LIKE '(%s)'" % user)
row = cur.fetchone()
用户表:
因此,根据我的表单中的POST
请求,打印内容如下:
Print(user, password) = ph104694 Password123
Print(row) = None
因此,您可以看到当数据绝对存在时,该行将作为None
返回。如果将user
更改为我知道不正确的内容,则会得到相同的结果,但是如果我将表从Users
更改为类似Users2
的内容,则会遇到{ {1}}错误,可以。因此,尽管匹配了数据,但有关我的语句的某些内容却不允许它产生该行。有什么想法吗?
答案 0 :(得分:3)
您的查询字符串的值为"SELECT * FROM Users WHERE Username LIKE '(ph104694)'"
。
请注意实际用户名中没有的括号。
此外,您几乎可以肯定不想使用LIKE
。
您想要的是"SELECT * FROM Users WHERE Username = 'ph104694'"
将使用"SELECT * FROM Users WHERE Username = '{user}'".format(user=user)
此外,您可以(并且应该)将此参数设置为
cur.execute("SELECT * FROM Users WHERE Username = :user", {user: user})
答案 1 :(得分:3)
您正在搜索的表达式的计算结果为(ph104694)
,而您显示的数据中显然没有 。
这里没有理由使用LIKE运算符,它可能与您要执行的操作相反(匹配与输入的用户ID完全匹配的单个记录)。
这是遭受SQL注入攻击的经典代码示例。您永远都不要使用字符串插值来构建这样的SQL字符串。而是使用参数替换。
总而言之,您想要这样的东西:
cur.execute("SELECT * FROM Users WHERE Username = ?", [user])