Il nostro sito Web è basato su API al 100% (con un client SPA). Recentemente, un hacker è riuscito a ottenere la password del nostro admin (hash con SHA-256) tramite SQL injection (e cracking pwd) come questo:
https://example.com/api/products?userId=3645&type=sqlinject here
È solo un esempio, ma per noi è mortale. Fortunatamente, è stato un bravo hacker e ci ha appena mandato un'email riguardo l'hack. Fortunato per un sito web sotto attacchi di costanti per tutti i suoi 5 anni di esistenza.
Sì, sappiamo che dobbiamo controllare l'input dell'utente ovunque e formattare correttamente / escape / istruzione preparata prima di inviare dati a MySQL. Lo sappiamo, e lo stiamo aggiustando. Ma non abbiamo abbastanza sviluppatori / tester per renderlo sicuro al 100%.
Ora supponiamo di avere una probabilità dello 0,1% di essere iniettati SQL in qualche modo. Come rendere più difficile per l'hacker trovarlo e limitare il danno il più possibile?
Cosa facciamo finora come soluzioni rapide / misure aggiuntive:
-
All'uscita "gate" condivisa da tutte le API, non inviamo più il PDOException e il messaggio come prima. Ma dobbiamo ancora dire al cliente che si è verificata un'eccezione:
{type: exception, code: err643, message: 'contact support for err643'}
Sono consapevole che se l'hacker vedrà un'eccezione, continuerà a provare ...
-
L'utente che PHP usa per connettersi a MySQL può solo CRUD alle tabelle. È abbastanza sicuro?
-
Rinomina tutte le tabelle (usiamo l'open source in modo che l'hacker possa indovinare il nome delle tabelle).
Che altro dovremmo fare?
Update : since there are many comments, I would like to give some side info
- First of all, this is LEGACY app, developed by some student-like folks, not enterprise grade. The dev team is nowhere to be found, now only 1-2 hybrid dev-test guy handling hundreds of Data Access class.
- The password is hash with SHA-256, yes it sucks. And we are changing it to recommended php way.
- SQL injection is 17 years old. Why is it still around?
- Are prepared statements 100% safe against SQL injection?