如果需要,请防止Python中的连接字符串污染攻击>>

问题描述 投票:2回答:1

当我传递数据库的用户的用户名和密码时,我想返回预定义查询的结果。

查询是常量,因此不是基本的SQL注入方案。

但是,允许用户指定将.format()输入连接字符串的用户名和密码会带来任何漏洞吗?

((我发现a source暗示确实如此-大多数我对sqlalchemy.create_enginepymongo.MongoClient感兴趣,但对任何常见的数据存储和python模块都感兴趣。)

如果需要,我应该如何修改下面的示例以清理输入?

from sqlalchemy import create_engine # requires module: psycopg2
import urllib.parse
import pandas as pd
import getpass

CONSTANT_QUERY_STRING = "SELECT * FROM table1;"
DB_URI = 'postgresql://{db_user}:{db_password}@postgres.acme.com:5432/acme_db'

class DbConnector:
  def __init__(self, db_uri, db_user, db_password):
    self.uri = db_uri.format(db_user=db_user, db_password=urllib.parse.quote_plus(db_password))

  def get_data(self, query):
      engine = create_engine(self.uri)
      df = pd.read_sql_query(query, con=engine)
      engine.dispose()
      return df

if __name__ == "__main__":
    userid = input('User: ')
    password = getpass.getpass('Password for {}:'.format(userid))
    df = DbConnector(DB_URI,userid,password).get_data(CONSTANT_QUERY_STRING)
    if df:
        print("Here's your data!")
        print(df)

我希望在传递用户的数据库用户名和密码时返回预定义查询的结果。该查询是常量,因此不是基本的SQL注入方案。但是,是否允许...

python security sqlalchemy pymongo sql-injection
1个回答
1
投票

像任何形式的注入一样-它取决于攻击者能够注入的特殊字符和可接受的URI格式。假设我注入了以下值:

© www.soinside.com 2019 - 2024. All rights reserved.