2017-11-07 2 views
0

ich versuche, eine SQL-Abfrage mit Sprintf() zu erzeugen, wo ich die gleiche Variable zweimalGolang Sprintf Formatierung einer Zeichenfolge und verwenden es mehrmals

myStr := "test" 
str := Sprintf("SELECT ... WHERE a = '%#[1]s' or b = '%#[1]s'", myStr) 
fmt.Println(str) 

Diese Schnipsel gibt das erwartete String

SELECT ... WHERE a = 'test' or b = 'test' 
verwenden

aber go vet sagt:

unrecognized printf flag for verb 's': '#' (vet) 

Und ich bin verwirrt, warum. Das protect-Verb auf v zu schalten erfüllt go vet, aber fügt " um meine Zeichenfolge hinzu. Und ich sehe ehrlich gesagt keinen Fehler bei der Verwendung von %#[1]s.

Irgendwelche Gedanken?

+1

Warum verwenden Sie '% # [1] s' anstelle von'% [1] s'? – tgogos

+0

Was erwarten Sie von der Flagge '#' mit Strings 's'? Was in der Paketdokumentation lässt dich glauben, dass # das Verb 's' modifiziert? – Volker

Antwort

6

Die Verwendung von printf zum Erstellen von Abfragen ist eine schlechte Idee, es öffnet sich für die SQL-Injektion.

Siehe benannte Parameter im sql Paket.

0

Es gibt kein # Sprintf-Flag für ein String-Verb (das Flag # ist beispielsweise das Hinzufügen von 0x für Hex-Werte:% # x). So entfernen Sie Ihre Go vet Probleme verschwinden lassen:

myStr := "test" 
str := Sprintf("SELECT ... WHERE a = '%[1]s' or b = '%[1]s'", myStr) 
fmt.Println(str) 

Aber: Wenn ein Teil Ihrer erstellte Abfrage (myStr) stammt aus externen Eingang (dh Benutzereingabe), sollten Sie wirklich Heins beraten folgen und benannte Parameter verwenden .

Verwandte Themen