Impedisci SQL injection in Go Postgresql

Oct 02 2020

Ho cercato nel forum di postgresql injection in Go e ho trovato alcune informazioni utili in SQL injection come di seguito:

Come eseguire una ricerca IN in SQL utilizzando Golang?

Come posso prevenire attacchi di SQL injection in Go durante l'utilizzo di "database / sql"?

ma ho ancora bisogno di qualche consiglio perché il mio codice in Go utilizza un diverso tipo di codice e casi d'uso. alcuni casi d'uso / domande per i quali ho bisogno di consigli sono come questo

  1. Utilizzando il ciclo di query per più inserimenti come l' INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s)uso di fmt.Sprintf, so che usare sprinft è pessimo. quindi c'è qualche soluzione per questa query di loop per l'inserimento? Ex:INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s),(%d,%d,%s),(%d,%d,%s)
  2. È sicuro usare fmt.Sprintf per generare query se il parametro sta usando %dinvece di %s?
  3. L'uso dell'istruzione Prepare e della query è sicuro, ma cosa succede se sto usando la funzione Select (using $1,$2) e la funzione NamedQuery (usando la struttura denominata.) Es: Select * from a where text = $1-> sta usando questo $1sicuro? ed Ex: Select * from a where text = :text-> è sicuro nella funzione NamedQuery?

Ho bisogno del tuo consiglio ragazzi. Grazie!

Risposte

5 KennyGrant Oct 02 2020 at 18:20

In primo luogo, di solito preferisci usare i segnaposto db? $ 1 ecc.

  1. Sì, è sicuro usare fmt.Sprintf con parametri interi per compilare SQL, anche se vale la pena evitarlo se puoi, ma il tuo terzo parametro è% s - evitalo e usa?
  2. Sì, è sicuro usare fmt.Sprintf con parametri interi, ma% so% v è molto più rischioso e lo eviterei, non riesco a pensare perché ne avresti bisogno.
  3. Usa i segnaposto qui, quindi sì, è sicuro.

Regole generali:

  • Usa segnaposto per impostazione predefinita, dovrebbe essere raro usare% d (come nella tua query IN per esempio)
  • Analizza i parametri in tipi come integer prima di qualsiasi convalida o utilizzo
  • Evita la concatenazione di stringhe se puoi e fai particolare attenzione ai parametri delle stringhe
  • Codifica sempre cose come i nomi delle colonne e delle tabelle, non generarle mai dall'input dell'utente (ad esempio? Sort = mystringcolname)
  • Verifica sempre che i parametri che ottieni siano solo quelli autorizzati per quell'utente