我正在为网站创建一个更改密码页面,该页面要求新密码和当前密码。使用scrypt库对旧密码进行散列和加盐处理,然后将其与sqlite3数据库中存储的密码进行比较,如果匹配,则对新密码进行散列并更新数据库。但是我在执行更新命令时遇到了困难,因为它引发了sqlite3.OperationalError:无法识别的令牌:“ \”错误。execute语句当前具有以下代码:
c.execute("UPDATE users SET password = \'{0}\' WHERE memberID = \'{1}\'".format(newPas, memID))
最初,我们认为该错误是由于在新密码本身中由于存在'而在字符串格式中使用'引起的,因此再次将其运行为:
c.execute("UPDATE users SET password = \"{0}\" WHERE memberID = \"{1}\"".format(newPas, memID))
这可以成功运行,但实际上不会更改数据库中的任何内容。我们还尝试创建一个查询字符串,然后执行该字符串。
query = "UPDATE users SET password = {0} WHERE memberID = {1}".format(newPas, memID)
c.execute(query)
这导致了sqlite3.OperationalError:“'\ xa1 \ x91 \ x9f \ x88 \ xfb \ x81 \ x12 \ xd4 \ xc2 \ xf9 \ xce \ x91y \ xf0 / \ xe1 *#\ x8aj \ xc7 \ x1d \ xd3 \ x91 \ x14 \ xcb \ xa4 \ xabaP [\ x02 \ x1d \ x1b \ xabr \ xc7 \ xe4 \ xee \ x19 \ x80c \ x8e | \ xc0S \ xaaX \ xc6 \ x04 \ xab \ x08 \ x9b \ x8e \ xd7zB \ xc6 \ x84 [\ xfb \ xbc \ x8d \ xfc'“:语法错误。我相信这是由于密码中存在'和'字符引起的,但是我不确定如何解决此问题,因为这些是由哈希过程添加的,因此删除它们会更改密码。要添加的是:
b'\xa1\x91\x9f\x88\xfb\x81\x12\xd4\xc2\xf9\xce\x91y\xf0/\xe1*#\x8aj\xc7\x1d\xd3\x91\x14\xcb\xa4\xabaP[\x02\x1d\x1b\xabr\xc7\xe4\xee\x19\x80c\x8e|\xc0S\xaaX\xc6\x04\xab\x08\x9b\x8e\xd7zB\xc6\x84[\xfb\xbc\x8d\xfc'
我想知道是否有人可以分享一些为什么它不喜欢“ \”字符或为什么它不更新数据库的见解,并指出正确的方向来使其工作。如果您需要更多信息或代码段,或者只是想对我大吼大叫,请不要犹豫!先感谢您 :)
您的代码有两件事:
format
来构建查询。这使您易于进行SQL注入,尽管在这种情况下您可能需要清理输入内容,但是这是一个会咬伤您的坏习惯。该查询的正确格式为:
conn = sqlite3.connect('my_db.db')
c = conn.cursor()
query = "UPDATE users SET password = ? WHERE memberID = ?"
c.execute(query, (newPas, memID))
conn.commit() # To finalise the alteration
附带说明一下,在这种情况下,游标需要一个元组,因此在传递单个值时会遇到一个常见的绊脚石:
query = "UPDATE users SET password = ? WHERE memberID = 'abc'"
c.execute(query, (newPas)) # Throws "incorrect number of bindings" error
# Use this instead i.e. pass single value as a tuple
c.execute(query, (newPas,))
您可以用来format
在查询中创建变量字段名称,因为在这种情况下不允许使用占位符:
fields = ['a', 'b', 'c']
query = "UPDATE users SET {} = ?".format(random.choice(fields))
除了使用它来帮助您构建大型查询之外,在这些查询中手动键入所有占位符会很繁琐,并且如果代码更改,则很难确保您拥有正确的数字:
my_list = ['a', 'b',...., n]
placeholders = ', '.join(['?' for item in my_list])
query = "INSERT .... VALUES = ({})".format(placeholders)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句