我有一段这样的代码:
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,但它太薄了。最后,我尝试使用我自己的测试数据库进行自己的注入攻击,但我不确定我的测试是否足够。测试这一点的好方法是什么?
发布于 2013-04-25 02:17:48
当您使用execute method并将所有变量输入保存在参数列表(在您的示例中为userInput,这是安全的)时,所有的DB-API模块都可以防止SQL注入。
事实证明,对于pgdb,它实际上是通过对每个参数进行转义来获得SQL字面值,然后将它们注入到SQL查询中的占位符中。这并不是必须的:一些数据库连接器可以将参数作为单独的结构而不是查询字符串的一部分传递给它们的服务器,这样做可能会带来性能上的好处。最终,您不应该真正关心使用的是什么方法--您将参数分别传递给DB-API连接器,它负责以一种安全的方式工作。
当然,如果您自己开始将变量放入查询中(例如"WHERE a ILIKE '%s'" % userInput),pgdb或任何其他连接器都无法阻止您伤害自己。
https://stackoverflow.com/questions/16196806
复制相似问题