pymysql使用用户提供的表字段作为输入来选择查询

c86crjj0  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(403)

我想知道是否可以用select进行查询,让用户给出表的字段和所需的值。例如:

field=input("Field: ")
value=input("Value: ")
cursorobject.execute('SELECT id FROM users WHERE {}=\'{}\'')
result=cursorobject.fetchall()
for x in result:
     print(x)

如果不可能,有什么办法吗?
ps:这个不行

nkoocmlb

nkoocmlb1#

当然,您可以根据需要使用变量构造查询的文本。例如

query = 'SELECT id FROM users WHERE {}=\'{}\''
print(query.format(field,value))

但是,请记住,在执行查询之前,应该很好地验证变量的内容,以避免sql注入。例如,变量的内容不应包含引号。
e、 g.以下代码以及变量的特定值将返回完整的用户列表:

field='name'
value='name\' or \'1\'=\'1'
query = 'SELECT id FROM users WHERE {}=\'{}\''
print(query.format(field,value))

生成的查询将是:

SELECT id FROM users WHERE name='name' or '1'='1'

编辑后,应将第3行替换为:

cursorobject.execute('SELECT id FROM users WHERE {}=\'{}\''.format(field,value))

为了尽可能避免sql注入,您应该使用框架的内置查询参数化功能—pymysql:

cursorobject.execute('SELECT id FROM users WHERE {}=%s'.format(field),(value))
gorkyyrv

gorkyyrv2#

只需格式化字段的查询,并将值作为的第二个参数传递 cursor.execute 必须接收iterable(即tuple/list):


# PREPARED STATEMENT

sql = 'SELECT id FROM users WHERE {} = %s'

# EXECUTE QUERY

cursorobject.execute(sql.format(field), (value,))

result = cursorobject.fetchall()

相关问题