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
- 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) - ¿Es seguro usar fmt.Sprintf para generar consultas si el parámetro está usando en
%dlugar de%s? - 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.
- 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?
- 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.
- 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