无法使用Python从PostgreSQL数据库检索哈希密码
问题描述:
所以我在python cgi中编写了一个简单的登录脚本。它不在本地主机上工作(显示500错误),因此自行运行代码显示存在代码问题。代码如下:无法使用Python从PostgreSQL数据库检索哈希密码
#!/usr/bin/python2.7
import cgi
import cgitb
import hashlib
import psycopg2
from dbconfig import *
cgitb.enable()
print "Content-Type: text/html"
def checkPass():
email = "[email protected]"
password = "blahblah"
password = hashlib.sha224(password.encode()).hexdigest()
result = cursor.execute('SELECT * FROM logins WHERE email=%s passhash=%s') % (email, password)
print str(result)
if __name__ == "__main__":
conn_string = "host=%s dbname=%s user=%s password=%s" % (host, database, dbuser, dbpassword)
conn = psycopg2.connect(conn_string)
cursor = conn.cursor()
checkPass()
程序遇到的行是postgre查询的cursor.execute。显示的错误如下:
Traceback (most recent call last):
File "login.py", line 28, in <module>
checkPass()
File "login.py", line 20, in checkPass
result = cursor.execute('SELECT * FROM logins WHERE email=%s passhash=%s') % (email, password)
ProgrammingError: syntax error at or near "passhash"
LINE 1: SELECT * FROM logins WHERE email=%s passhash=%s
而且应该指出,它指向passhash。我试图直接进入查询到数据库中PSQL控制台为:
SELECT * FROM logins WHERE passhash=storedhashedcode;
然而,这返回有关哈希的名称的列中的错误(即e342hefheh43hfhfhefherf ....等)不存在。我在这里做错了什么?我能想到的唯一事情就是哈希以不同的方式存储。
注 - 这里是我用来存储密码等的代码,如果这能帮助:
email = "[email protected]"
allpass = "blahblah"
password = hashlib.sha224(allpass.encode()).hexdigest()
cursor.execute('INSERT INTO logins (email, passhash) VALUES (%s, %s);', (email, password))
conn.commit()
任何帮助将不胜感激!
UPDATE:
至于建议的Decly,我已经改变了查询:
result = cursor.execute('SELECT * FROM logins WHERE email=%s AND passhash=%s') % (email, password)
现在,这将产生错误:
ProgrammingError: column "s" does not exist
LINE 1: SELECT * FROM logins WHERE email=%s AND passhash=%s
所以,这显然是在利用S作为列出于某种原因。为什么它没有使用我的变量名?
答
在:
'SELECT * FROM logins WHERE email=%s passhash=%s'
你缺少A和布尔表达式:
'SELECT * FROM logins WHERE email=%s AND passhash=%s'
当你写你缺少的字符串字面引号PSQL的查询,以便PostgreSQL是推断列名,你应该写:
SELECT * FROM logins WHERE passhash='storedhashedcode';
你也把parentesis在不对的地方,蟒蛇一句话应该是:
result = cursor.execute('SELECT * FROM logins WHERE email= %s AND passhash= %s', (email, password))
好吧,我已经添加了AND的建议,但现在它像以前一样抛出了同样的错误,除了参考'%s' –
对不起,不是很同样的错误,现在它将s看作是一个字符串,而不是放入变量。 –
明白了。显然,你不会按照我的方式设置查询。现在还有另一个问题,但这是另一个鱼群。 –