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
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)- Ist es sicher, mit fmt.Sprintf eine Abfrage zu generieren, wenn der Parameter
%danstelle von verwendet wird%s? - 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.
- 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?
- 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.
- 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