Python 字符串中的hose%被游标使用。直接执行,因为它知道它正在生成SQL,所以它可以做更多的工作来保护您。有趣的是,为什么它单独使用变量而不是在数组中工作(var1、var2、var3)?根据DB API规范,看起来两种情况都有可能:@thekashyap再次

Python 字符串中的hose%被游标使用。直接执行,因为它知道它正在生成SQL,所以它可以做更多的工作来保护您。有趣的是,为什么它单独使用变量而不是在数组中工作(var1、var2、var3)?根据DB API规范,看起来两种情况都有可能:@thekashyap再次,python,sql,Python,Sql,字符串中的hose%被游标使用。直接执行,因为它知道它正在生成SQL,所以它可以做更多的工作来保护您。有趣的是,为什么它单独使用变量而不是在数组中工作(var1、var2、var3)?根据DB API规范,看起来两种情况都有可能:@thekashyap再次仔细阅读。不安全的是使用字符串格式运算符%。事实上,我在回答中是这样说的。。我想象了一个%而不是,在字符串和变量之间。。由于种种原因,我无法撤消我的否决票。。我个人希望看到描述中提到的不安全/攻击等词,其中您说不要使用%。@eric答案是不要使



字符串中的hose
%
游标使用。直接执行
,因为它知道它正在生成SQL,所以它可以做更多的工作来保护您。有趣的是,为什么它单独使用变量而不是在数组中工作(var1、var2、var3)?根据DB API规范,看起来两种情况都有可能:@thekashyap再次仔细阅读。不安全的是使用字符串格式运算符
%
。事实上,我在回答中是这样说的。。我想象了一个
%
而不是
在字符串和变量之间。。由于种种原因,我无法撤消我的否决票。。我个人希望看到描述中提到的不安全/攻击等词,其中您说不要使用
%
。@eric答案是不要使用
%
运算符格式化字符串。字符串中的
%
正被
游标使用。直接执行
,因为它知道它正在生成SQL,所以它可以做更多的事情来保护您。实际上,这不是SQL转义。它是变量绑定,更简单、更直接。解析后,这些值会绑定到SQL语句中,使其免受任何注入攻击。那么,是SQL转义还是变量绑定取决于数据库服务器/DB-API驱动程序的好坏。我见过一些现实世界中广泛部署的生产数据库,它们的DB-API驱动程序只是进行转义,而不是将数据和代码保留在线路上的带外。不用说,我不太尊重那些所谓的“数据库”。实际上,这不是SQL转义。它是变量绑定,更简单、更直接。解析后,这些值会绑定到SQL语句中,使其免受任何注入攻击。那么,是SQL转义还是变量绑定取决于数据库服务器/DB-API驱动程序的好坏。我见过一些现实世界中广泛部署的生产数据库,它们的DB-API驱动程序只是进行转义,而不是将数据和代码保留在线路上的带外。不用说,我不太尊重那些所谓的“数据库”。一些DB-API实现实际上使用%s作为变量——最明显的是PostgreSQL的psycopg2。这不应与使用%s和%s运算符替换字符串混淆(尽管很容易混淆)。如果为了可移植性,我们可以定义一种为DB-API指定SQL参数的标准方法,那就太好了。一些DB-API实现实际上使用%s作为变量——最明显的是PostgreSQL的psycopg2。这不应与使用%s和%s运算符替换字符串混淆(尽管很容易混淆)。如果为了可移植性,我们可以定义一种为DB-API指定SQL参数的标准方法,那我就太好了。可以用外部SQL脚本做同样的事情吗?可以用外部SQL脚本做同样的事情吗?
cursor.execute("INSERT INTO table VALUES var1, var2, var3,")
cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))
cursor.execute("insert into Attendees values (?, ?, ?)", (name,
seminar, paid) )
cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))
cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3))
# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))