在Python SQLite3 API中安全地创建SQL语句

时间:2014-05-09 04:29:49

标签: python sql sqlite

Python docs状态

# Never do this -- insecure!
symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)

# Do this instead
t = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', t)
print c.fetchone()

我了解第一个选项容易受SQL injection attack攻击。我不明白的是为什么第二种选择会更安全。 Aren这些相同吗?

1 个答案:

答案 0 :(得分:1)

否 - execute方法将注意正确地转义参数。因此,如果tRobert'); DROP TABLE Students;--,则在第二种情况下将传输到数据库引擎的完整命令将类似于

SELECT * FROM stocks WHERE symbol='Robert\'); DROP TABLE Students;--'

这是安全的(注意反斜杠)。

编辑:(实际上,请注意CL的评论)