Il nostro sito web è al 100% basato su API (con un client SPA). Recentemente, un hacker è riuscito a ottenere la password del nostro amministratore (con hash SHA-256) tramite SQL injection (e cracking di pwd) in questo modo:
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 inviato un'e-mail riguardo l'hack. Fortunatamente per un sito web che subisce attacchi costanti durante i suoi 5 anni di esistenza.
Sì, sappiamo che dobbiamo controllare l'input dell'utente ovunque ed eseguire correttamente formattare / uscire / istruzioni preparate prima di inviare i dati a MySQL. Lo sappiamo e lo stiamo aggiustando. Ma non abbiamo abbastanza sviluppatori / tester per renderlo sicuro al 100%.
Ora supponendo di avere lo 0,1% di possibilità di essere iniettato SQL in qualche modo. Come possiamo rendere più difficile per gli hacker trovarlo e limitare il più possibile il danno?
Cosa facciamo per quanto riguarda soluzioni rapide / misurazioni aggiuntive:
-
Al "gate" di output condiviso da tutte le API, non inviamo più il PDOException grezzo e il messaggio come prima. Ma dobbiamo ancora dire al client che si è verificata un'eccezione:
{type: exception, code: err643, message: 'contact support for err643'}
Sono consapevole che se un hacker vede 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).
Cos'altro dovremmo fare?
Aggiornamento: dato che ci sono molti commenti, vorrei dare alcune informazioni a margine
- Prima di tutto, questo è LEGACY app, sviluppata da persone simili a studenti, non di livello aziendale. Il team di sviluppo non si trova da nessuna parte, ora solo 1-2 tizi ibridi dev-test che gestiscono centinaia di classi di accesso ai dati.
- La password è hash con SHA-256, sì, fa schifo. E lo stiamo cambiando in modo php consigliato.
- SQL injection ha 17 anni. Perché è ancora disponibile?
- Le istruzioni preparate sono sicure al 100% contro l'iniezione SQL?