【发布时间】:2014-04-30 10:28:06
【问题描述】:
当我阅读时:http://docs.python.org/2/library/sqlite3.html
# Never do this -- insecure!
symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
为什么它不安全?没有理由在网上详细解释。
【问题讨论】:
当我阅读时:http://docs.python.org/2/library/sqlite3.html
# Never do this -- insecure!
symbol = 'RHAT'
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol)
为什么它不安全?没有理由在网上详细解释。
【问题讨论】:
想想如果symbol 包含' OR '' = ' 会发生什么——攻击者可以为查询插入完全任意的条件。如果您在同一张表中有其他客户帐户的信息,或者正在更新,则这一点尤其值得关注。
【讨论】:
如果symbol 包含用户提供或不受信任的数据,则会创建一个SQL injection vulnerability。
为了安全起见,请始终这样做(正如您正在阅读的同一页中提到的那样):
symbol = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', symbol)
所以现在即使symbol 包含恶意数据,它也会被正确转义并且不会造成任何伤害,更糟糕的是查询没有返回任何结果。
【讨论】:
sqlite_3_bind_* 系列调用从查询中完全带外传递数据——因此不需要转义。