2013-04-24 78 views
1

我有这样一段代码:pgdb防止注入攻击吗?

db = pgdb.connect(
    database=connection['database'], 
    user=connection['user'], 
    host=connection['host']) 
cursor = db.cursor() 
# ask database 
query = ''' 
    SELECT a, b, c 
    FROM table 
    WHERE a ILIKE %s;''' 
try: 
    cursor.execute(query, userInput) 
except pgdb.Error, error: 
    error = str(error) 
    print json.dumps({ 
     'errorMessage': 'ERROR: %s' % error 
    }) 

我已阅读another forum像MySQLdb的Python模块都逃脱防止对注入攻击。我也浏览了documentation on pgdb,但它非常薄。最后,我试图用我自己的测试数据库来做自己的注射攻击,但我不确定我的测试是否足够。什么是测试这个的好方法?

回答

1

当您使用execute method时,所有DB-API模块都可以防止SQL注入,并且所有变量输入保留在参数列表中(在您的示例中为userInput,这很安全)。

事实证明,对于pgdb这样做的方式确实是通过转义每个参数来获取SQL文字值,然后将它们注入到SQL查询中的占位符中。这不一定是这种情况:某些数据库连接器可以将参数作为单独的结构传递给它们的服务器,而不是查询字符串的一部分,并且这样做有潜在的性能优势。最终,尽管您不应该关心使用什么方法 - 您将参数分别传送到DB-API连接器,并且有责任以安全的方式进行工作。

当然,如果您自己开始将变量放入查询中(例如"WHERE a ILIKE '%s'" % userInput),pgdb或任何其他连接器都无法阻止您伤害自己。