Sim*_*rax 6 python sqlite sql-injection
首先,我对数据库还很陌生,昨天我开始使用Python。
我开始使用 sqlite3 模块(在此之前我通过 Perl 中的 DBI 使用了一些 Sqlite)
我在官方 Python Sqlite 文档中偶然发现了以下示例
# 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()
Run Code Online (Sandbox Code Playgroud)
为什么第一个例子不安全而第二个例子不安全?
可以说我有一些存储文档的应用程序,用户可以通过文档名称搜索数据库。
为此,我需要用户输入,然后使用关键字创建查询
我不明白为什么元组现在应该比字符串更“安全”,我的意思是在这两种情况下用户都可以输入类似“xyz OR 1=1”的内容来显示每条记录。
我希望有人好心地向我解释这一点。我知道这对于有经验的人来说可能是非常明显的。
参数与简单的字符串替换不同;他们将值直接提供给数据库,无需进一步解释:
>>> import sqlite3
>>> db=sqlite3.connect(":memory:")
>>> db.execute("CREATE TABLE t(x)")
>>> db.execute("INSERT INTO t VALUES('x'),('secret')")
>>> db.execute("SELECT * FROM t WHERE x = '%s'" % ("x' OR 1=1--",)).fetchall()
[(u'x',), (u'secret',)]
>>> db.execute("SELECT * FROM t WHERE x = ?", ("x' OR 1=1--",)).fetchall()
[]
Run Code Online (Sandbox Code Playgroud)
使用参数,您将获得与为所有特殊字符(在本例中为 )正确引用该值相同的效果WHERE x = 'x'' OR 1=1--'。