2017-04-18 122 views
0

所以我在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作为列出于某种原因。为什么它没有使用我的变量名?

回答

1

在:

'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)) 
+0

好吧,我已经添加了AND的建议,但现在它像以前一样抛出了同样的错误,除了参考'%s' –

+0

对不起,不是很同样的错误,现在它将s看作是一个字符串,而不是放入变量。 –

+0

明白了。显然,你不会按照我的方式设置查询。现在还有另一个问题,但这是另一个鱼群。 –