sql >> Base de Datos >  >> RDS >> Mysql

Base64 como método para desinfectar la entrada del usuario para Mysql

No "desinfectar" entrada como un medio para evitar la inyección SQL - usar marcadores de posición (o escape apropiado) , siempre. Se consistente. Cuidate. El problema ya está resuelto.

Este caso será "seguro" debido al dominio limitado del base64_encode función. Sin embargo...

Es es la mala práctica y el almacenamiento de valores codificados en base64 (de modo que la consulta que se muestra puede funcionar) conlleva varios errores negativos. implicaciones a medida que cambia la información almacenada:destruye el orden de los valores hace que la información no se pueda buscar de forma trivial , requiere un adicional paso "codificar/decodificar", e incluso consume más espacio - ¡ay!

Por lo tanto, si bien puede haber casos específicos para codificar datos en base64, este enfoque no adecuado como medio para mitigar la inyección SQL .

El problema se debe al acceso a SQL a través de un protocolo de texto donde el comando de consulta/forma y valores están entremezclados. El uso de correcto técnicas de escape (por ejemplo, mysql_real_escape_string ) corrige esto asegurándose de que la información se escape para que el texto SQL sea analizado según lo previsto; sin embargo, a diferencia de un paso de codificación base64, no en realidad cambiar la información suministrada!

Este es exactamente qué proporcionan los marcadores de posición ! Los marcadores de posición son el enfoque universalmente correcto y debe fomentarse. Los marcadores de posición permiten enviar la consulta y los valores a la base de datos por separado cuando sea compatible con la biblioteca/base de datos; y son emulados escapando de otra manera. El uso correcto del marcador de posición elimina Inyección SQL y la necesidad de que el código de usuario entremezcle valores en el texto del comando SQL, lo que también puede hacer que las consultas sean más fáciles de escribir y mantener.

Para evitar que los "programadores individuales" escriban consultas terribles, la solución es prevenir las consultas ad-hoc se dispersen en el código:recopile las operaciones de acceso a datos en una Capa de acceso a datos ( DAL) (posiblemente junto con un ORM) y solo exponga acciones relevantes, asegurando el uso adecuado de SQL dentro del DAL. En proyectos más simples, el DAL también es una ubicación adecuada para administrar de forma centralizada las reglas comerciales para el saneamiento y otra lógica de validación.

Más exactamente:

  • Desinfectar valores para reglas de negocio; esto debería evitar la "información incorrecta", como un nombre de usuario que es demasiado corto, contiene caracteres restringidos o no cumple con los requisitos comerciales.

  • Usar marcadores de posición para evitar Inyección SQL . Esto es estrictamente relacionado con la transferencia de datos a SQL y no tiene nada que ver con la información que contiene.

Mientras que MySQL 5.6.1 agrega FROM_BASE64 , de modo que la codificación podría usarse simplemente en el texto del comando SQL, esto aún agrega un paso de decodificación explícito adicional y complica la consulta cuando se usa un esquema de codificación de este tipo. Este enfoque base64 es simplemente no necesario, ya que existen técnicas comprobadas para prevenir la inyección SQL y no se propuso en la pregunta inicial.