我有一段这样的代码:
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,但它非常薄。最后,我尝试使用自己的测试数据库进行自己的注入攻击,但我不确定我的测试是否足够。什么是测试这个的好方法?
答案 0 :(得分:1)
当您使用execute
method并保留参数列表中的所有变量输入时,所有DB-API模块都可以防止SQL注入(在您的示例中为userInput
,这是安全的)。
事实证明,对于pgdb
,它的实现方式确实是通过转义每个参数来获取SQL文字值,然后将它们注入SQL查询中的占位符。不一定是这种情况:某些数据库连接器可以将参数作为单独的结构而不是查询字符串的一部分传递给它们的服务器,并且这样做可能会带来性能上的好处。最终,虽然您不应该真正关心使用什么方法 - 您可以将参数单独提供给DB-API连接器,并且可以安全地使其工作。
当然,如果您自己开始将变量放入查询中(例如"WHERE a ILIKE '%s'" % userInput
),pgdb
或任何其他连接器都无法阻止您伤害自己。