pymysql SELECT 查询用户提供的 table 字段作为输入

pymysql SELECT query with field of table that the user gives as input

我想知道是否可以使用 select 进行查询,用户提供 table 的字段和所需的值。例如:

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

如果不可能,有什么办法吗?

PS:这个不行

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

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

但是,请记住,在执行查询之前,您应该很好地验证变量的内容,以避免 SQL injections。例如,变量的内容不应包含引号。

例如下面的代码,以及变量的具体值,将 return 完整的用户列表:

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))

只需为 field 格式化查询并将 value 作为参数传递给 cursor.execute 的第二个参数,它必须接收一个可迭代的(即 tuple/list):

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

# EXECUTE QUERY
cursorobject.execute(sql.format(field), (value,))

result = cursorobject.fetchall()