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()
我想知道是否可以使用 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()