PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

psycopg2 cursor.execute() con il parametro di query SQL provoca un errore di sintassi

Credo che affermazioni parametrizzate come questa debbano essere utilizzate con valori e non i nomi delle tabelle (o le parole chiave SQL, ecc.). Quindi sei praticamente sfortunato con questo.

Tuttavia, non preoccuparti, poiché questo meccanismo ha lo scopo di prevenire l'iniezione di SQL e normalmente sai a quale tabella desideri accedere al momento della scrittura del codice, quindi ci sono poche possibilità che qualcuno possa iniettare codice dannoso. Basta andare avanti e scrivere la tabella nella stringa.

Se, per qualche motivo (forse perverso) mantieni il nome della tabella parametrico in questo modo:

  1. Se il nome della tabella deriva dal tuo programma (ad es. un dizionario o un attributo di classe), esegui la consueta sostituzione di stringhe.
  2. Se il nome della tabella proviene dal mondo esterno (pensa all'"input dell'utente"):o non farlo, o fidati completamente dell'utente e applica l'approccio precedente 1.

Ad esempio:

cursor.execute(
    'SELECT * FROM %s where %s = %s'
    % ("my_table", "colum_name", "%s"), #1
    ("'some;perverse'string;--drop table foobar")) #2

#1 :Lascia che il terzo %s venga sostituito con un altro '%s' in questo momento, per consentire un'elaborazione successiva da parte di psycopg2#2 :Questa è la stringa che verrà citata correttamente da psycopg2 e posizionata al posto del terzo '%s' nella stringa originale