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
- 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) - É seguro usar fmt.Sprintf para gerar consulta se o parâmetro estiver usando em
%dvez de%s? - 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.
- 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?
- 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.
- 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
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
Christopher Nolan uma vez se arrependeu de ter lido o 'roteiro de Pulp Fiction' de Quentin Tarantino