Impedir injeção de SQL em Go Postgresql

Oct 02 2020

Eu pesquiso em torno do fórum de injeção de postgresql no Go e encontrei algumas informações úteis sobre injeção de SQL como abaixo:

Como executar uma pesquisa IN em SQL usando Golang?

Como posso evitar ataques de injeção de SQL no Go ao usar "database / sql"?

mas ainda preciso de alguns conselhos porque meu código em Go está usando um tipo de código e casos de uso diferentes. alguns casos de uso / perguntas sobre os quais preciso de conselhos são assim

  1. Usar o loop de consulta para inserir vários como INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s)usar fmt.Sprintf, eu sei que usar sprinft é ruim. então, há alguma solução para esta consulta de loop para inserir? Ex:INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s),(%d,%d,%s),(%d,%d,%s)
  2. É seguro usar fmt.Sprintf para gerar consulta se o parâmetro estiver usando em %dvez de %s?
  3. Usar a instrução Prepare e Query é seguro, mas e se eu estiver usando a função Select (usando $1,$2) e função NamedQuery (usando struct nomeado.) Ex: Select * from a where text = $1-> está usando este $1seguro? e Ex: Select * from a where text = :text-> isso é seguro na função NamedQuery?

Precisamos de seus conselhos, pessoal. Obrigado!

Respostas

5 KennyGrant Oct 02 2020 at 18:20

Em primeiro lugar, geralmente prefere usar os espaços reservados db? $ 1 etc.

  1. Sim, é seguro usar fmt.Sprintf com parâmetros inteiros para construir SQL, embora valha a pena evitá-lo se puder, mas seu terceiro parâmetro é% s - evite isso e use?
  2. Sim, é seguro usar fmt.Sprintf com parâmetros inteiros, mas% s ou% v é muito mais arriscado e eu evitaria, não consigo imaginar por que você precisa disso.
  3. Use marcadores de posição aqui, então sim, é seguro.

Regras gerais:

  • Use marcadores de posição por padrão, deve ser raro usar% d (como em sua consulta IN, por exemplo)
  • Analisa os parâmetros em tipos como inteiro antes de qualquer validação ou uso
  • Evite string concat se puder, e seja particularmente cuidadoso com parâmetros de string
  • Sempre codifique coisas como nomes de colunas e tabelas, nunca os gere a partir da entrada do usuário (por exemplo? Sort = mystringcolname)
  • Sempre valide se os parâmetros que você obtém são apenas aqueles autorizados para aquele usuário