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.

psycopg2 identificador parcial

_sql = sql.SQL(“SELECT * FROM {prefix}_prefixed_table_name”).format(prefix=sql.Identifier(“prefix”))

_sql.as_string(conn)

Resultado SELECT * FROM “prefix”_prefixed_table_name

Lo que quiero SELECT * FROM prefix_prefixed_table_name o SELECT * FROM “prefix_prefixed_table_name”

¿Cómo puedo lograr esto?

Como una solicitud de klin, ¿por qué no funcionaría

_sql = sql.SQL(“SELECT * FROM {prefix}_prefixed_table_name”).format(prefix=sql.SQL(“prefix”))

se podría simplemente ingresar

“another_table_name; — ”

lo que daría como resultado

SELECT * FROM another_table_name; — _prefixed_table_name

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr el resultado deseado sería utilizar comillas dobles alrededor del prefijo y el nombre de la tabla en la declaración SQL, de la siguiente manera:

    _sql = sql.SQL('SELECT * FROM "{}_prefixed_table_name"').format(sql.Identifier('prefix'))
    

    Esto producirá la declaración SQL SELECT * FROM "prefix_prefixed_table_name", la cual incluirá las comillas dobles alrededor del prefijo y el nombre de la tabla.

    Alternativamente, podría utilizar comillas simples alrededor del prefijo y el nombre de la tabla, de la siguiente manera:

    _sql = sql.SQL("SELECT * FROM '{prefix}_prefixed_table_name'").format(prefix='prefix')
    

    Esto producirá la declaración SQL SELECT * FROM 'prefix_prefixed_table_name', la cual incluirá comillas simples alrededor del prefijo y el nombre de la tabla.

    En ambos casos, el uso de la clase Identifier garantiza que el prefijo se trate como un único identificador y no sea vulnerable a ataques de inyección SQL.

    En cuanto a por qué la solución sugerida de utilizar sql.SQL("prefix") en lugar de sql.Identifier("prefix") no funcionaría, es porque simplemente sustituiría la cadena “prefix” en la declaración SQL, en lugar de tratarla como un identificador. Esto lo haría vulnerable a ataques de inyección SQL. Por ejemplo, si el prefijo se estableciera en "'); DROP TABLE users; -- ", la declaración SQL resultante sería:

    SELECT * FROM ''); DROP TABLE users; -- _prefixed_table_name
    

    Esto ejecutaría la declaración SELECT, pero también eliminaría la tabla users debido al código SQL inyectado. El uso de sql.Identifier evita que esto suceda al tratar el prefijo como un único identificador, independientemente de su contenido.

Comments are closed.