Unsere Website basiert zu 100% auf APIs (mit einem SPA-Client). Kürzlich hat es ein Hacker geschafft, das Passwort unseres Administrators (mit SHA-256 gehasht) durch SQL-Injection (und Cracking von pwd) wie folgt zu erhalten:
https://example.com/api/products? userId = 3645&type = sqlinject here
Dies ist nur ein Beispiel, aber für uns tödlich. Zum Glück war es ein netter Hacker und er hat uns nur eine E-Mail über den Hack geschickt. Glück für eine Website, die während ihres 5-jährigen Bestehens unter Konstantenangriffen steht.
Ja, wir wissen, dass wir Benutzereingaben überall überprüfen und Anweisungen ordnungsgemäß formatieren / entkommen / vorbereiten müssen, bevor wir Daten an MySQL senden. Wir wissen, und wir reparieren es. Wir haben jedoch nicht genügend Entwickler / Tester, um die Sicherheit zu 100% zu gewährleisten.
Angenommen, wir haben eine Wahrscheinlichkeit von 0,1%, dass SQL irgendwie injiziert wird. Wie erschweren wir es Hackern, es zu finden und den Schaden so gering wie möglich zu halten?
Was wir tun, um schnelle Korrekturen / zusätzliche Messungen durchzuführen:
-
Am von allen APIs gemeinsam genutzten "Gate" -Ausgang senden wir die unformatierte PDOException und Nachricht nicht mehr wie zuvor. Wir müssen dem Client jedoch weiterhin mitteilen, dass eine Ausnahme aufgetreten ist:
{Typ: Ausnahme, Code: err643, Nachricht: 'Support für err643 kontaktieren'}
Ich bin mir bewusst, dass Hacker, die eine Ausnahme sehen, es weiterhin versuchen werden ...
-
Der Benutzer, mit dem PHP eine Verbindung zu MySQL herstellt, kann nur CRUD-Tabellen erstellen. Ist das sicher genug?
-
Benennen Sie alle Tabellen um (wir verwenden Open Source, damit Hacker den Tabellennamen erraten können).
ol> - Zunächst einmal ist dies LEGACY App, entwickelt von einigen Studenten-ähnlichen Leuten, nicht für Unternehmen. Das Entwicklerteam ist nirgends zu finden, jetzt nur noch 1-2 Hybrid-Entwickler, die Hunderte von Datenzugriffsklassen verarbeiten.
- Das Passwort ist Hash mit SHA-256, ja, es ist scheiße. Und wir ändern es auf den empfohlenen PHP-Weg.
- SQL Injection ist 17 Jahre alt. Warum gibt es das noch?
- Sind vorbereitete Anweisungen 100% sicher gegen SQL-Injection? ol>
Was sollen wir noch tun?
Update: Da es viele Kommentare gibt, möchte ich einige Nebeninformationen geben.