Prevenir la inyección de SQL en Go Postgresql

Oct 02 2020

Investigué en el foro de inyección postgresql en Go y encontré información útil en la inyección SQL como la siguiente:

¿Cómo ejecutar una búsqueda IN en SQL usando Golang?

¿Cómo puedo evitar los ataques de inyección SQL en Go mientras uso "database / sql"?

pero todavía necesito algunos consejos porque mi código en Go usa un tipo de código y casos de uso diferentes. algunos casos de uso / preguntas para los que necesito consejo son como este

  1. Usando el bucle de consultas para múltiples INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s)inserciones como usar fmt.Sprintf, sé que usar sprinft es malo. entonces, ¿hay alguna solución para esta consulta de bucle para insertar? Ex:INSERT INTO a (a1,a2,a3) VALUES (%d,%d,%s),(%d,%d,%s),(%d,%d,%s)
  2. ¿Es seguro usar fmt.Sprintf para generar consultas si el parámetro está usando en %dlugar de %s?
  3. Usar Preparar declaración y Consulta es seguro, pero ¿qué sucede si estoy usando la función Seleccionar (usando $1,$2) y la función NamedQuery (usando la estructura nombrada). Ej: Select * from a where text = $1-> ¿está usando esta $1caja fuerte? y Ej .: Select * from a where text = :text-> ¿Es seguro esto en la función NamedQuery?

Por favor, necesitan sus consejos, chicos. ¡Gracias!

Respuestas

5 KennyGrant Oct 02 2020 at 18:20

En primer lugar, ¿suele preferir utilizar los marcadores de posición de db? $ 1 etc.

  1. Sí, es seguro usar fmt.Sprintf con parámetros enteros para construir SQL, aunque vale la pena evitarlo si puede, pero su tercer parámetro es% s - ¿evitarlo y usarlo?
  2. Sí, es seguro usar fmt.Sprintf con parámetros enteros, pero% s o% v es mucho más arriesgado y lo evitaría, no puedo pensar por qué lo necesitaría.
  3. Use marcadores de posición aquí, entonces sí, es seguro.

Reglas generales:

  • Use marcadores de posición de forma predeterminada, debería ser raro usar% d (como en su consulta IN, por ejemplo)
  • Analice los parámetros en tipos como integer antes de cualquier validación o uso
  • Evite la concatenación de cadenas si puede, y tenga especial cuidado con los parámetros de cadena
  • Siempre codifique cosas como nombres de columnas y tablas, nunca las genere a partir de la entrada del usuario (por ejemplo,? Sort = mystringcolname)
  • Siempre valida que los parámetros que obtienes son solo los autorizados para ese usuario