【发布时间】:2018-02-18 17:32:14
【问题描述】:
首先,我对数据库很陌生,昨天开始使用 Python。
我开始使用 sqlite3 模块(在此之前我通过 Perl 中的 DBI 使用了一些 Sqlite)
我在官方 Python Sqlite 文档here 上偶然发现了以下示例
# 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()
为什么第一个例子不安全而第二个不安全?
假设我有一些存储文档的应用程序,用户可以通过文档名称搜索数据库。
为此,我需要用户输入,然后使用关键字/s 创建查询
我不明白为什么元组现在应该比字符串更“安全”,我的意思是在这两种情况下,用户都可以输入“xyz OR 1=1”之类的内容来显示每条记录。
我希望有人好心向我解释这一点。我知道这对于有经验的人来说可能非常明显。
【问题讨论】:
-
秘诀在于如何处理元组。
-
“在这两种情况下,用户都可以输入诸如“xyz OR 1=1”之类的内容来显示每条记录”——不,这就是重点。请在你喜欢的搜索引擎中搜索“sql injection”,这个覆盖面很广。
标签: python sqlite sql-injection