2016-11-21 1 views
0

Ich verstehe im Grunde, dass meine SQL-Anweisung nicht ausgeführt wird, wenn es keine Variable aufgeführt ist, was ich tun möchte, ist zu überprüfen, ob ein Name existiert vor dem Schreiben (ich kann das wahrscheinlich innerhalb von SQL tun). Ich verstehe das Problem, einfach nicht, wie ich es korrigieren soll ... Ich dachte, ich würde jetzt fragen, bevor es 21:30 Uhr ist und ich bin immer noch dabei, das Problem zu untersuchen. DankIch muss eine if-Anweisung auf eine SQL-Abfrage ausführen, mit einer Variablen bereitgestellt oder leer

app.py

import sqlite3 
from sqlalchemy.orm import sessionmaker 
from tabledef import * 
engine = create_engine('sqlite:///tutorial.db', echo=True) 
Session = sessionmaker(bind=engine) 
session = Session() 

USERNAME = "Jas" 
PASSWORD = "Booger" 
EMAIL = "[email protected]" 
AMOUNT = "500" 
reg = User(USERNAME, PASSWORD, EMAIL, AMOUNT) 

conn = sqlite3.connect("tutorial.db") 
c = conn.cursor() 
try: 
    c.execute('SELECT username from users WHERE username = "%s"' % USERNAME) 
    result = str(c.fetchall()).split("'")[1] 
    print result 
except ValueError as e: 
    print e 

Fehlermeldung

Traceback (most recent call last): 
    File "C:/Users/sysadmin/PycharmProjects/bet1/app3.py", line 18, in <module> 
    result = str(c.fetchall()).split("'")[1] 
IndexError: list index out of range 

Antwort

1

Nicht ganz sicher, was Sie fragen, aber ich schlage vor, Sie den folgenden Abschnitt aus dem Python manual lesen:

# Never do this -- insecure! 
symbol = 'RHAT' 
c.execute("SELECT * FROM stocks WHERE symbol = '%s'" % symbol) 

# Do this instead 
t = ('RHAT',) 
c.execute('SELECT * FROM stocks WHERE symbol=?', t) 
print c.fetchone() 

Zusätzlich zu SQL Injection-Angriffen wird auch fetchone() anstelle von ... converting verwendet Ihre Antwort auf eine Zeichenfolge und erneutes Parsen.

+0

Das macht Sinn und ich werde sicher sein, das zu integrieren, um die Flucht und andere unerwünschte Zeichen zu entfernen. Was ich frage ist, wenn Sie eine dieser Variablen oberhalb der c.execute leer hatten, werde ich diesen Fehler bekommen, weil die Abfrage nichts zurückgab. Ich denke, ich kann das herausfinden, ich fand SELECT EXISTS-Anweisung online, die mir die Zeit sparen würde, aber danke für die SQL-inj-Info. –

+0

Hmm, es erscheint, wenn meine Variablen aus einem Formular kommen, die obige Methode wird immer noch für einen Benutzer Code aus dem POST injizieren. Es scheint also, dass ich noch etwas entkommen muss, richtig? Oder gibt es einen besseren Weg, um injizierten Code aus Formularen zu verhindern? –

+0

Diese Methode sollte automatisch alles korrekt entkommen. – Lunaweaver

Verwandte Themen