2010-11-29 6 views
3

Zum Einsetzen in eine Tabelle, der sichere Weg istsichere Art und Weise sqlite3 Tisch in Python

c.execute("insert into table (?,?,?,...)",my_tuple) 

zu schaffen, aber wie kann man einen Tisch sicher schaffen? Ich habe so etwas wie dies versucht:

conn = sqlite3.connect(database) 
c = conn.cursor() 
cmd = "create table ? (? text,? text)" 
my_tuple = ("my_table","first","second") 
c.execute(cmd,my_tuple) 

aber ich bekomme Fehler wie folgt aus:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
sqlite3.OperationalError: near "?": syntax error 

Sollte ich nur eine Zeichenfolge in Python zusammenstellen und es an SQLite werfen die Tabelle zu erstellen?

+3

Ich nehme an, Sie aus Benutzereingaben eine Tabelle zu erstellen sind versuchen, nicht wahr? Seufz, keine Ahnung, wenn das eine gute Idee ist. Ich nehme an, Sie sollten die Eingabe anhand der Standards für Tabellennamen und Spaltennamen validieren. Ich nehme auch an, dass Sie die Verwendung eingeschränkter SQL-Befehle blockieren müssen, damit eine Tabelle mit dem Namen "create" nicht verwendet wird. Macht Sinn? –

+0

execute() verwende nur das "?" Ausdruck auf Werten, deshalb ist es sicher. Wenn Sie zulassen, dass Benutzer Tabellen und Felder benennen, die nicht mehr sicher sind. Wie auch immer, du könntest ein Präfix in der Eingabe hinzufügen. – Kabie

+0

Huh? Ich verstehe nicht, warum der Schöpfer und der Betrachter jemals unterschiedliche Vertrauensstufen haben sollten. Wenn der Sicherheitsmechanismus bereits vorhanden ist, um Code zu überprüfen, der an sqlite übergeben wird, würde ich denken, dass er für andere Arten von Befehlen wie create zugänglich sein sollte. Ich mache mir in meiner winzigen Anwendung keine Gedanken darüber, ich kann mir nicht vorstellen, wie man die Erstellung von Tabellen ständig mit ihrem Code in Verbindung bringen kann. Ich versuche nur, lustige CSV-Dateien zu importieren. Vielleicht gibt es einen besseren Weg? – mathtick

Antwort

2

Wenn Sie nur CSV-Dateien versuchen, importieren und unter der Annahme, dass sie nicht zu Ihnen durch some user who might try to mess with your database gesendet werden, setzen Sie es einfach zusammen in Python:

"create table %s (%s text,%s text)" % ("my_table","first","second") 

Wenn es eine Chance gibt, die Tabellen könnten Wenn Sie von einem böswilligen Benutzer kommen, liegt es an Ihnen, sich um die Bereinigung der Spalten-/Dateinamen zu kümmern.

+0

Hygienisierung: beispielsweise nur alphanums oder irgendeine andere vernünftige Untermenge der Dinge in der Benutzereingabe erlaubt (gültig einen regulären Ausdruck oder String-Methode). –

2

Diese Antwort auf eine similar question könnte https://stackoverflow.com/a/3247553/1709198

Dort wird der Antworter helfen dachte, es war nicht möglich, Tabellen mit dem Fragezeichen-Methode zu benennen und vorgeschlagen, stattdessen einen Weg zu ‚sanieren‘ Eingänge durch eine Funktion zu ‚schrubben‘ definieren die Eingabe, die Dinge wie )(][;, entfernen würde, so dass jemand nicht versuchen kann, in sQL-Code wie ); drop tables -- zu verwirren Dinge zu werfen.

Ich weiß auch von irgendeiner Weise nicht auf die Fragezeichen-Methode Arbeit mit Tabellennamen zu machen, und ich denke, das ist ‚sterilisieren Sie die Zeichenfolge‘ Methode ungefähr so ​​gut wie es geht.

Verwandte Themen