es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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)
Tags:  , , , ,

Answer

  1. Avatar for 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:

    qry = qry.filter(getattr(ormClass, attr) >= sa.literal(value))
    

    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.

Comments are closed.