Używanie pysqlite Tworzę procedurę, by zrobić coś z pewnymi danymi. Ten sam rodzaj pracy odbywa się na podobnych polach w wielu tabel i kolumn, więc pomyślałem, że mógłbym parametryzacji sql, jak pokazano poniżej:pysqlite: Zastępowanie zastępcze dla nazw kolumn lub tabel?
def foo():
column = 'c'
table = 't'
row = 1
# preferred approach, gives syntax error
c.execute('SELECT ? FROM ? WHERE id=?', (column, table, row))
# sanity check, works fine
c.execute('SELECT c FROM t WHERE id=?', (row))
# workaround, also works, but is this the right way?
c.execute('SELECT % FROM % WHERE id=?' % (column, table), row))
Błąd pojawia nie jest bardzo pomocny (sqlite3.OperationalError: near "?": syntax error
), ale zdobądź punkt: Pysqlite nie docenia, że w ten sposób używane są symbole zastępcze.
Czy ktoś może wskazać, co się tutaj dzieje, wraz z właściwym sposobem postępowania?
Czy jest to bezpieczne z iniekcji SQL? – berkelem
@berkelem: Jest podatny na wstrzyknięcia SQL. Niestety, ponieważ nazwy kolumn i tabel są nierozerwalne, nie ma możliwości uniknięcia formatowania ciągów. [Używanie białych list] (https://phpdelusions.net/sql_injection#whitelist) jest tutaj najlepszą praktyką. – unutbu