2016-10-31 3 views
-3

Ich schrieb einen Wraper/Validator über Pg in gehen, wenn ich auf eine ziemlich nervige Sache ... sehr lange Strings als Argument übergeben. Im Prinzip habe ich diese Zeichenfolge:Go und Multiline-Argument Hölle

"UPDATE " + m["table"] + "_tags SET keys = keys || ," + strconv.Itoa(key) + " WHERE tag = " + t + ";" + "INSERT INTO " m["table"] + "_tags (tag,keys) SELECT '" + t + "', '" + strconv.Itoa(key) + ") WHERE NOT EXISTS(SELECT 1 FROM " + m["table"]"_tags WHERE tag = " + t + ");" 

Ok, groß, unweildy, voll 'und“... die Hölle auf Erde Aber das ist, wie SQL-Abfragen sucht eine ganz offen gesagt kann ich nicht von einem besseren denken. Art und Weise von ihnen dynamisch zu komponieren.

so In einer angemessenen Sprache wie C++ ist dies einfach arbeiten. In JavaScript würde ich hinzufügen, „\“ am Ende jeder ... etc

gibt es eine solche Mechaniker in gehen? Ich habe zuvor gehört, dass das Hinzufügen von "," am Ende jeder Zeile ist das Äquivalent von \ in Javascript aber die Dokumentation dafür scheint eher schlecht geschrieben zu sein und die meisten Beispiele online zitieren Dinge wie:

"Ändern Sie Ihre SQL-Abfrage" (machbar, aber nicht genau die Lösung, die ich von einer Low-Level-Sprache will) . "Verwenden Sie 'am Anfang und Ende" ... aber da es keine Möglichkeit gibt,' innerhalb von 'zu entkommen, wäre das ziemlich schwierig (Hinzufügen von zusätzlichen 6 * + Operatoren) und ich bin mir ziemlich unsicher, ob' Wrapping 'funktioniert wenn ich + Verkettungen innen habe. Vorschläge?

(best ich mit oben kommen kann ist die Zeichenfolge außerhalb des Arguments konstruieren, aber noch einmal, dass scheint hack-ish)

+2

"In einer vernünftigen Sprache" - Ihr Code-Snippet ignoriert gute Sicherheitsmaßnahmen unabhängig von der Sprache. Geh nicht zu, es ist eine gute Sache. – evanmcdonnal

+0

Warten Sie, warum? Diese Werte werden nicht direkt aus der Benutzereingabe eingegeben, sie bestehen eine Gültigkeitsprüfung (und einige Formatierungen vorher). Sollten Sie sich vor der SQL-Injektion "drinnen" der Abfragen hüten? –

+0

Vielleicht ist Ihre Upstream-Formatierung/Validierung ausreichend, um dies sicher zu machen, kann ich nicht wirklich sagen, basierend auf dem, was hier ist. Dieser Code riecht allerdings. Ich bin mir sicher, dass es bessere Möglichkeiten gibt, dies zu tun, auch wenn sie ein bisschen mehr Arbeit machen. Ich würde diese dynamische Abfrage Assembly nur aus Gründen der Komplexität empfehlen. Warten Sie, bis Sie einen Defekt haben und Sie durch die Logs der Datenbank schauen, um zu sehen, welche Abfragen ausgeführt wurden, und dann versuchen, sie in Ihrer App mit bestimmten Eingaben zu reproduzieren, die dazu führen, dass diese Abfrage erstellt wird. Sie sind besser dran mit 10 Sprocs als eine 100-Linien-Funktion, um Abfragen zu generieren Imo – evanmcdonnal

Antwort

0

eine Vorlage erstellen:

`UPDATE %s_tags SET keys = keys || %d WHERE tag = %d; INSERT INTO %s ...;` 

Dann in den Parametern übergeben.

P.S. Dies kann anfällig für den Angriff sein, überprüfen Sie die Werte, bevor Sie sie einstecken.

+0

Danke, Antwort, die ich suchte, Silly mich vergaß, die waren eigentlich eine Sache. Ich denke, das passiert mit meinem Gehirn, nachdem ich zu viele Skriptsprachen benutzt habe ... –