使用 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')