为什么sql命令不安全?

时间:2014-03-23 01:57:22

标签: python sqlite

我正在阅读:http://docs.python.org/2/library/sqlite3.html

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

为什么它不安全?没有理由在网上详细解释。

2 个答案:

答案 0 :(得分:3)

考虑一下如果symbol包含' OR '' = '会发生什么 - 攻击者可以为查询插入完全任意的标准。如果您在同一个表中有关于其他客户帐户的信息,或者正在进行更新,则特别关注这一点。

此外,http://xkcd.com/327/

答案 1 :(得分:0)

如果symbol包含用户提供或不受信任的数据,则会创建SQL injection vulnerability

为了安全起见,请务必这样做(正如您正在阅读的同一页中提到的那样):

symbol = ('RHAT',)
c.execute('SELECT * FROM stocks WHERE symbol=?', symbol)

现在即使symbol包含恶意数据,它也会被正确转义并且不会造成任何伤害,更糟糕的是查询不会返回任何结果。