¿Esta metodología conduce a la inyección de SQL?
He creado una función para buscar en una tabla utilizando un diccionario (par de atributo-valor). Me gustaría saber si diseñar métodos de esta manera podría provocar una Inyección SQL. En caso afirmativo, ¿cómo se puede sanitizar adecuadamente el valor antes de utilizarlo para construir una consulta?
Inyección SQL en – qry = qry.filter(getattr(ormClass, attr) >= value)
El valor proviene del lado del cliente en forma de una solicitud JSON.
Env – Python, SQLAlchemy, FastAPI
def listRequired(session, ormClass, reqData: dict, toSearch: tuple[str, ...]):
searchParam: dict = {}
for param in toSearch:
try:
searchParam[param] = reqData[param]
except KeyError:
raise ExceptionResponse(
status=Response.KEY_NOT_FOUND,
details=param + " no encontrado")
qry = session.query(ormClass)
for attr, value in searchParam.items():
qry = qry.filter(getattr(ormClass, attr) >= value)
print(qry)
return qry.limit(50)
davy.ai
Diseñar métodos como el mencionado en la pregunta podría llevar potencialmente a una Inyección de SQL. Esto se debe a que si el valor proviene del lado del cliente y no está adecuadamente sanitizado, puede contener declaraciones SQL maliciosas o caracteres especiales que se pueden utilizar para manipular la consulta.
Para sanitizar adecuadamente el valor antes de utilizarlo para construir una consulta, se pueden utilizar consultas parametrizadas o declaraciones preparadas. En SQL Alchemy, esto se puede hacer utilizando el método
params()
, el cual sanitiza automáticamente los datos de entrada. Aquí hay un ejemplo:El método
sa.literal()
se encarga de sanitizar adecuadamente el valor antes de construir la consulta. Esto ayuda a prevenir ataques de Inyección de SQL.