使用 python 中的列表防止 sql 注入
Prevent sql injection with lists in python
所以我有一个要插入数据库的格式化字符串列表,它们经过格式化,因此数据库将接受这种类型的字符串。
以下是格式示例:
mylist = [('123456789'), ('987654321'), ('1234554321'),....('9999999999')]
mylist[0] = ('123456789')
必须保持格式以确保输入正确。
我想确保它可以安全地防止 sql 注入,
我知道这行得通:
database = connection.cursor()
for data in mylist:
command = " INSERT INTO my_table(my_value) VALUES %s" %data
database.execute(command)
connection.commit()
但是我不确定这是否是防止 sql 注入的正确方法
我想做但行不通的是:
database = connection.cursor()
for data in mylist:
command = " INSERT INTO my_table(my_value) VALUES %s"
database.execute(command, (data))
connection.commit()
我收到的错误是:
'str' object is not callable
我在网上看到 here 这是正确的,为什么它不起作用
你需要传入一个元组:
database.execute(command, (data,))
注意逗号!也可以传入一个列表:
database.execute(command, [data])
因为你有一个要插入的值列表,你可以使用 cursor.executemany()
让数据库一次应用所有值,但是你需要使列表中的每个元素成为一个元组或列表:
with connection:
with connection.cursor() as cursor:
command = "INSERT INTO my_table(my_value) VALUES %s"
cursor.executemany(command, ((data,) for data in mylist))
请注意,您可以将连接和游标都用作上下文管理器。当连接的 with
块结束时,事务会自动为您提交,除非发生异常,此时事务被回滚。 cursor
上下文管理器关闭游标,释放与游标关联的资源。见 psycopg2
documentation.
很难理解你的意思。这是我的尝试:
mylist = ['123456789','987654321','1234554321','9999999999']
mylist = [tuple(("('{0}')".format(s),)) for s in mylist]
records_list_template = ','.join(['%s'] * len(mylist))
insert_query = '''
insert into t (s) values
{0}
'''.format(records_list_template)
print cursor.mogrify(insert_query, mylist)
cursor.execute(insert_query, mylist)
conn.commit()
输出:
insert into t (s) values
('(''123456789'')'),('(''987654321'')'),('(''1234554321'')'),('(''9999999999'')')
插入的元组:
select * from t;
s
----------------
('123456789')
('987654321')
('1234554321')
('9999999999')
所以我有一个要插入数据库的格式化字符串列表,它们经过格式化,因此数据库将接受这种类型的字符串。
以下是格式示例:
mylist = [('123456789'), ('987654321'), ('1234554321'),....('9999999999')]
mylist[0] = ('123456789')
必须保持格式以确保输入正确。
我想确保它可以安全地防止 sql 注入,
我知道这行得通:
database = connection.cursor()
for data in mylist:
command = " INSERT INTO my_table(my_value) VALUES %s" %data
database.execute(command)
connection.commit()
但是我不确定这是否是防止 sql 注入的正确方法
我想做但行不通的是:
database = connection.cursor()
for data in mylist:
command = " INSERT INTO my_table(my_value) VALUES %s"
database.execute(command, (data))
connection.commit()
我收到的错误是:
'str' object is not callable
我在网上看到 here 这是正确的,为什么它不起作用
你需要传入一个元组:
database.execute(command, (data,))
注意逗号!也可以传入一个列表:
database.execute(command, [data])
因为你有一个要插入的值列表,你可以使用 cursor.executemany()
让数据库一次应用所有值,但是你需要使列表中的每个元素成为一个元组或列表:
with connection:
with connection.cursor() as cursor:
command = "INSERT INTO my_table(my_value) VALUES %s"
cursor.executemany(command, ((data,) for data in mylist))
请注意,您可以将连接和游标都用作上下文管理器。当连接的 with
块结束时,事务会自动为您提交,除非发生异常,此时事务被回滚。 cursor
上下文管理器关闭游标,释放与游标关联的资源。见 psycopg2
documentation.
很难理解你的意思。这是我的尝试:
mylist = ['123456789','987654321','1234554321','9999999999']
mylist = [tuple(("('{0}')".format(s),)) for s in mylist]
records_list_template = ','.join(['%s'] * len(mylist))
insert_query = '''
insert into t (s) values
{0}
'''.format(records_list_template)
print cursor.mogrify(insert_query, mylist)
cursor.execute(insert_query, mylist)
conn.commit()
输出:
insert into t (s) values
('(''123456789'')'),('(''987654321'')'),('(''1234554321'')'),('(''9999999999'')')
插入的元组:
select * from t;
s
----------------
('123456789')
('987654321')
('1234554321')
('9999999999')