Verhindern Sie SQL Injection in Go Postgresql

Oct 02 2020

Ich recherchiere im Forum für Postgresql-Injection in Go und habe einige nützliche Informationen in SQL-Injection gefunden, wie unten:

Wie führe ich eine IN-Suche in SQL mit Golang aus?

Wie kann ich SQL-Injection-Angriffe in Go verhindern, während ich "database / sql" verwende?

Aber ich brauche noch einige Ratschläge, da mein Code in Go eine andere Art von Code und Anwendungsfällen verwendet. Einige Verwendungszwecke / Fragen, für die ich Rat brauche, sind wie folgt

  1. INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s)Ich weiß, dass die Verwendung von Abfrage-Schleifen für mehrere Einfügungen wie bei Verwendung von fmt.Sprintf schlecht ist. Gibt es also eine Lösung für diese Schleifenabfrage zum Einfügen? Ex:INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s),(%d,%d,%s),(%d,%d,%s)
  2. Ist es sicher, mit fmt.Sprintf eine Abfrage zu generieren, wenn der Parameter %danstelle von verwendet wird %s?
  3. Die Verwendung von Prepare-Anweisung und Abfrage ist sicher, aber was ist, wenn ich die Funktion Select (using) verwende? $1,$2) und Funktion NamedQuery (unter Verwendung der benannten Struktur) Beispiel: Select * from a where text = $1-> Verwendet dieser $1Safe? und Bsp.: Select * from a where text = :text-> ist dies in der Funktion NamedQuery sicher?

Bitte brauchen Sie Ihren Rat Jungs. Dankeschön!

Antworten

5 KennyGrant Oct 02 2020 at 18:20

Erstens, bevorzugen Sie normalerweise die Verwendung der DB-Platzhalter? $ 1 usw.

  1. Ja, es ist sicher, fmt.Sprintf mit ganzzahligen Parametern zum Erstellen von SQL zu verwenden, obwohl es sich lohnt, dies zu vermeiden, wenn Sie können, aber Ihr dritter Parameter ist% s - vermeiden Sie das und verwenden Sie?
  2. Ja, es ist sicher, fmt.Sprintf mit ganzzahligen Parametern zu verwenden, aber% s oder% v sind weitaus riskanter und ich würde vermeiden, ich kann mir nicht vorstellen, warum Sie es brauchen würden.
  3. Verwenden Sie hier Platzhalter, dann ist es sicher.

Allgemeine Regeln:

  • Verwenden Sie standardmäßig Platzhalter. Es sollte selten vorkommen, dass% d verwendet wird (wie zum Beispiel in Ihrer IN-Abfrage).
  • Analysieren Sie Parameter vor jeder Validierung oder Verwendung in Typen wie Integer
  • Vermeiden Sie String Concat, wenn Sie können, und seien Sie besonders vorsichtig mit String-Parametern
  • Immer hart codieren Dinge wie Spalten- und Tabellennamen, niemals aus Benutzereingaben generieren (zB? Sort = mystringcolname)
  • Stellen Sie immer sicher, dass die Parameter, die Sie erhalten, nur die für diesen Benutzer autorisierten sind