Nuestro sitio web es 100% basado en API (con un cliente SPA). Recientemente, un hacker logró obtener la contraseña de nuestro administrador (con hash con SHA-256) a través de la inyección de SQL (y pwd de craqueo) de esta manera:
https://example.com/api/products?userId=3645&type=sqlinject here
Es solo un ejemplo, pero es mortal para nosotros. Afortunadamente, fue un buen hacker y nos acaba de enviar un correo electrónico sobre el hack. Por suerte, un sitio web con constantes de ataques a lo largo de sus 5 años de existencia.
Sí, SABEMOS que necesitamos verificar la entrada del usuario en todas partes y hacer un formato / escape / declaración preparados adecuadamente antes de enviar datos a MySQL. Lo sabemos, y lo estamos arreglando. Pero no tenemos suficientes desarrolladores / probadores para que sea 100% seguro.
Ahora, asumiendo que tenemos un 0.1% de probabilidad de ser SQL inyectado de alguna manera. ¿Cómo hacemos que sea más difícil para un hacker encontrarlo y limitar el daño posible?
Lo que hacemos en cuanto a soluciones rápidas / medidas adicionales:
-
En la "puerta" de salida compartida por todas las API, ya no enviamos la excepción PDOException y el mensaje como antes. Pero todavía tenemos que decirle al cliente que ocurrió la excepción:
{type: exception, code: err643, message: 'contact support for err643'}
Soy consciente de que si el pirata informático ve una excepción, seguirá intentando ...
-
El usuario que usa PHP para conectarse a MySQL solo puede CRUD a las tablas. ¿Es eso lo suficientemente seguro?
-
Cambie el nombre de todas las tablas (usamos código abierto para que el pirata informático pueda adivinar el nombre de las tablas).
¿Qué más debemos hacer?
Actualización: dado que hay muchos comentarios, me gustaría darles un lado. info
- En primer lugar, esta es la aplicación LEGACY, desarrollada por algunas personas similares a estudiantes, no de grado empresarial. El equipo de desarrollo no está en ninguna parte, ahora solo uno o dos tipos de pruebas de desarrollo híbrido que manejan cientos de clases de acceso a datos.
- La contraseña es hash con SHA-256, sí, apesta. Y lo estamos cambiando a php recomendado.
- inyección SQL tiene 17 años. ¿Por qué sigue ahí?
- ¿Las declaraciones preparadas son 100% seguras contra la inyección de SQL?