Notre site Web est 100% basé sur l'API (avec un client SPA). Récemment, un hacker a réussi à obtenir le mot de passe de notre administrateur (haché avec SHA-256) par injection SQL (et craquage de pwd) comme ceci:
https://example.com/api/products? userId = 3645&type = sqlinject here
Ce n'est qu'un exemple, mais c'est mortel pour nous. Heureusement, c'était un bon hacker et il nous a juste envoyé un e-mail à propos du hack. Heureusement pour un site Web soumis à des attaques constantes tout au long de ses 5 ans d'existence.
Oui, nous savons que nous devons vérifier les entrées des utilisateurs partout et faire correctement les instructions de formatage / d'échappement / préparées avant d'envoyer des données à MySQL. Nous savons et nous sommes en train de le réparer. Mais nous n'avons pas assez de développeurs / testeurs pour le rendre sûr à 100%.
Maintenant, en supposant que nous ayons 0,1% de chance d'être injecté SQL d'une manière ou d'une autre. Comment pouvons-nous rendre plus difficile pour les hackers de les trouver et limiter les dégâts au maximum?
Que faisons-nous en ce qui concerne les solutions rapides / mesures supplémentaires:
-
A la "porte" de sortie partagée par toutes les API, nous n'envoyons plus l'exception PDOException brute et le message comme avant. Mais nous devons encore informer le client qu'une exception s'est produite:
{type: exception, code: err643, message: 'contacter le support pour err643'}
Je suis conscient que si le pirate voit une exception, il continuera d'essayer ...
-
L'utilisateur que PHP utilise pour se connecter à MySQL ne peut CRUD qu'aux tables. Est-ce assez sûr?
-
Renommez toutes les tables (nous utilisons l'open source pour que le pirate puisse deviner le nom des tables).
Que devons-nous faire d'autre?
Mise à jour: comme il y a beaucoup de commentaires, je voudrais donner quelques informations complémentaires
- Tout d'abord, c'est LEGACY application, développée par certains étudiants, pas de niveau entreprise. L'équipe de développement est introuvable, maintenant seulement 1 ou 2 gars de test de développement hybride gérant des centaines de classes d'accès aux données.
- Le mot de passe est haché avec SHA-256, oui ça craint. Et nous le changeons en mode PHP recommandé.
- L'injection SQL a 17 ans. Pourquoi est-ce toujours là?
- Les instructions préparées sont-elles 100% sûres contre l'injection SQL?