【问题标题】:why the sql command is insecure? [duplicate]为什么sql命令不安全? [复制]
【发布时间】: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)  

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

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    想想如果symbol 包含' OR '' = ' 会发生什么——攻击者可以为查询插入完全任意的条件。如果您在同一张表中有其他客户帐户的信息,或者正在更新,则这一点尤其值得关注。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • "Escaped" 如果您使用的数据库设计不佳的有线协议。如果您正在使用具有精心设计的有线协议的数据库(以及利用相同协议的库),则绑定参数的值不仅会被转义,而且会完全从查询本身带外传递。 SQLite 本身没有有线协议,但它的 C API 使用 sqlite_3_bind_* 系列调用从查询中完全带外传递数据——因此不需要转义。
      猜你喜欢
      • 1970-01-01
      • 2015-03-03
      • 2011-06-16
      • 2014-06-12
      • 2015-06-19
      • 2020-01-21
      • 2014-03-26
      • 2011-08-13
      • 2012-03-22
      相关资源
      最近更新 更多