Ist diese Streichersubstitution bei der Erstellung von SQL-Abfragen verpönt, wie vergeben Sie den Tabellennamen dynamisch?

Ziemlich neu in sqlite3, also bär mit mir hier

Ich hätte gern eine Funktion, auf die ich den Tabellennamen übergeben kann und die zu aktualisierenden Werte.

Zuerst habe ich mit so etwas begonnen:

def add_to_table(table_name, string): cursor.execute('INSERT INTO {table} VALUES ({var})' .format( table=table_name, var=string) ) 

Das funktioniert A-OK, aber weiter lesen über sqlite3 schlug vor, dass dies eine furchtbar unsichere Art war, über Dinge zu gehen. Allerdings mit ihren ? Syntax kann ich keinen Namen geben, um die Variable anzugeben.

Ich habe versucht, in einem ? Anstelle der Tabelle, aber das wirft einen Syntaxfehler.

 cursor.execute('INSERT INTO ? VALUES (?)', ('mytable','"Jello, world!"')) >> >sqlite3.OperationalError: near "?": syntax error 

Kann der table in einer sql-Anweisung sicher und dynamisch weitergegeben werden?

  • Wie bekomme ich _sqlite3.so Datei?
  • Python sqlite3 String Variable in execute
  • Sqlite3.DatabaseError: Datei ist verschlüsselt oder keine Datenbank
  • INSERT Wörterbuch sqlite3 (python)
  • Python - sqlite3 kann nicht nach dem Update-Commit auswählen - funktioniert beim Wiederholen
  • Notwendigkeit zu überprüfen und padding sqlite Datenbank Haushaltung und manipulieren Code
  • Sqlite - Verwenden Sie Backticks (`) oder doppelte Anführungszeichen (") mit Python
  • Sqlite3 Einsatz mit Python und Python cgi
  • 2 Solutions collect form web for “Ist diese Streichersubstitution bei der Erstellung von SQL-Abfragen verpönt, wie vergeben Sie den Tabellennamen dynamisch?”

    Es ist nicht die dynamische String-Substitution per-se das Problem. Seine dynamische String-Substitution mit einem vom Benutzer bereitgestellten String, der das große Problem darstellt, weil das Sie zu SQL-Injection-Attacken öffnet. Wenn Sie absolut 100% sicher sind, dass die tablename eine sichere Zeichenfolge ist, die Sie kontrollieren, dann splicing es in die SQL-Abfrage wird sicher sein.

     if some_condition(): table_name = 'TABLE_A' else: table_name = 'TABLE_B' cursor.execute('INSERT INTO '+ table_name + 'VALUES (?)', values) 

    Das heißt, mit dynamischen SQL wie das ist sicherlich ein Code-Geruch, so dass Sie überprüfen sollten, um zu sehen, ob Sie eine einfachere Alternative ohne die dynamisch generierten SQL-Strings finden können. Darüber hinaus, wenn Sie wirklich wollen, dynamische SQL dann etwas wie SQLAlchemy könnte nützlich sein, um zu garantieren, dass die SQL Sie generieren ist gut gebildet.

    Das Verfassen von SQL-Anweisungen mit String-Manipulation ist nicht nur wegen der Sicherheitsimplikationen ungerade, sondern auch, weil Strings "dumme" Objekte sind. Mit sqlalchemy Kern (Sie brauchen nicht einmal die ORM-Teil) ist fast wie mit Strings, aber jedes Fragment wird viel schlauer und ermöglichen eine leichtere Komposition. Werfen Sie einen Blick auf die sqlalchemy Wiki , um eine Vorstellung davon zu bekommen, was ich rede.

    Zum Beispiel, mit sqlsoup Ihr ​​Code würde wie folgt aussehen:

     db = SQLSoup('sqlite://yourdatabase') table = getattr(db, tablename) table.insert(fieldname='value', otherfield=123) db.commit() 

    Ein weiterer Vorteil: Code ist datenbankunabhängig – will nach Orakel ziehen? Ändern Sie die Verbindungszeichenfolge und Sie sind fertig.

    Python ist die beste Programmiersprache der Welt.