2016-03-20 14 views
2

Ich kann kein gutes Beispiel für die richtige Art finden, den String-Teil einer Textanfrage mit den Werten zu verbinden. Zum Beispiel:Richtiger Weg zum Schreiben einer Text-SQL-Abfrage in Go

query := `SELECT column_name FROM table_name 
     WHERE column1_name = %d AND column2_name = %d` % (val1, val2) 
rows, res, err := db.Query(query) 

Dies funktioniert nicht. Der Compiler gibt syntax error: unexpected comma, expecting) wahrscheinlich zurück, weil ich versuche, ein Python-Tupel zu verwenden.

Wenn ich umschreiben es als

query := `SELECT column_name FROM table_name 
     WHERE column1_name = %d AND column2_name = %d` % val1 

ich (mismatched types string and int) bekommen, die mir sagt, dass das Tupel Eines der Probleme war.

Wenn ich meinen ersten Parameter als Strings werfen, ich (operator % not defined on string)

In Python, Sie so etwas wie

query = """SELECT column_name FROM table_name 
    WHERE column1_name = %d 
    AND column2_name = %d""" % (val1, val2) 

ODER

query = """SELECT column_name FROM table_name 
    WHERE column1_name = %s 
    AND column2_name = %s""" % (val1_string, val2_string) 

tun würde, ich weiß, ich konnte nur werfen die Werte als Zeichenfolgen und concat mit "STRING" + var + "STRING", aber das scheint wirklich chaotisch im Vergleich zu der Python-Version. Was ist das Pendant zu diesem Python-Code in Go? Insbesondere das Einschließen des Tupelabschnitts und das Verketten einer Zeichenfolge und einer Ganzzahl.

+0

Sie 'Sprintf' suchen? –

+1

gibt es ein tolles Video, dass ich auch gerne auf Sie verweisen würde, es ist wie-in-Datenbank in Golang: https://www.youtube.com/watch?v=m879N2rzn2g – Roylee

Antwort

2

< Standard admonishment über String-Interpolation mit SQL-Anweisungen wegen Injection-Schwachstellen>

können Sie fmt.Sprintf verwenden, um dies zu handhaben.

query := fmt.Sprintf(`SELECT columnA FROM tableA WHERE columnB = %d AND columnB = %s`, 
        someNumber, someString) 

Zur Injektion Fragen, schreiben Sie Ihren ersten Code zu vermeiden wie:

query := `SELECT column_name FROM table_name 
    WHERE column1_name = %d AND column2_name = %d` 

rows, err := db.Query(query, val1, val2) 
+0

für den Fall, dass Sie brandneue sind SQL Injection gibt der Abfrage, die einen anderen Befehl beendet und ausführt, einen speziell gestalteten Wert, z '1; DROP TABLE-TabelleA'. Wenn Sie jetzt Ihre scheinbar gutartige Auswahlabfrage ausführen, wird Ihr Tisch tatsächlich gelöscht. –

+0

@jniedrauer das funktioniert super! Aber das ist das Gegenteil von dem, was du tust :). Jede Produktions-SQL-API verfügt über injektions-sichere Interpolationsoptionen. Es in der Sprache zu tun (auch in Python wie oben) ist anfällig für die Injektion. –

+0

Von bobby-tables.com genommen: '# Tun Sie es nicht so.' ' cmd = "update Menschen setzen Name = '% s' wo ID = '% s'"% (Name, ID) ' 'curs.execute (cmd)' ' ' #In statt, tun Sie dies: ' ' cmd = "update Leute setzen Name =% s wo ID =% s" ' ' curs.execute (cmd, (Name, ID)) ' Aber ich sehe keine Möglichkeit, das mit Go's MyMySQL zu tun. Vielleicht habe ich einfach nicht genug RTFM. Ich greife die Benutzereingabe als Ganzzahl, um die Injektion vor diesem Code-Code zu verhindern. Ich denke, ich muss wirklich nur den richtigen Weg kennen, um eine Textanfrage in MyMySQL zu schreiben ... –

Verwandte Themen