1

我有一段这样的代码:

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
    })

我在另一个论坛上读到,像 MySQLdb 这样的 python 模块会进行转义以防止注入攻击。我还查看了pgdb 上的文档,但它很薄。最后,我尝试使用自己的测试数据库进行自己的注入攻击,但我不确定我的测试是否足够。什么是测试这个的好方法?

4

1 回答 1

1

当您使用将所有变量输入保存在参数列表中的方法时,所有 DB-API 模块都可以防止 SQL 注入(executeuserInput的示例中,这是安全的)。

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

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

于 2013-04-24T18:17:48.030 回答