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
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:
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:
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 desql.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:Esto ejecutaría la declaración
SELECT
, pero también eliminaría la tablausers
debido al código SQL inyectado. El uso desql.Identifier
evita que esto suceda al tratar el prefijo como un único identificador, independientemente de su contenido.