Nasza strona internetowa jest w 100% oparta na API (z klientem SPA). Niedawno hakerowi udało się zdobyć hasło naszego administratora (zaszyfrowane za pomocą SHA-256) poprzez wstrzyknięcie SQL (i złamanie pwd) w następujący sposób:
https://example.com/api/products? userId = 3645&type = sqlinject tutaj
To tylko przykład, ale jest dla nas zabójczy. Na szczęście był to miły haker i właśnie wysłał nam e-mail o włamaniu. Na szczęście strona internetowa jest poddawana ciągłym atakom przez 5 lat istnienia.
Tak, wiemy, że musimy wszędzie sprawdzać dane wejściowe użytkowników i odpowiednio sformatować / uciec / przygotować instrukcję przed wysłaniem danych do MySQL. Wiemy i naprawiamy to. Ale nie mamy wystarczającej liczby programistów / testerów, aby uczynić go w 100% bezpiecznym.
Teraz zakładając, że mamy 0,1% szans na wstrzyknięcie SQL. Jak utrudnić hakerowi znalezienie go i jak najbardziej ograniczyć szkody?
Co robimy, jeśli chodzi o szybkie poprawki / dodatkowe pomiary:
-
Na wyjściu „gate” współdzielonym przez wszystkie API nie wysyłamy już surowego wyjątku PDOException i wiadomości, jak wcześniej. Ale nadal musimy powiedzieć klientowi, że wystąpił wyjątek:
{type :ception, code: err643, message: 'contact support for err643'}
Wiem, że jeśli haker zobaczy wyjątek, będzie próbował ...
-
Użytkownik, którego PHP używa do łączenia się z MySQL, może używać CRUD tylko do tabel. Czy to wystarczająco bezpieczne?
-
Zmień nazwy wszystkich tabel (używamy oprogramowania open source, aby haker mógł odgadnąć nazwy tabel).
Co jeszcze powinniśmy zrobić?
Aktualizacja: ponieważ jest wiele komentarzy, chciałbym podać dodatkowe informacje
- Przede wszystkim jest to LEGACY aplikacja, opracowana przez niektórych studentów, a nie klasy korporacyjnej. Nigdzie nie ma zespołu programistów, teraz tylko 1-2 hybrydowych deweloperów obsługujących setki klas Data Access.
- Hasło to hash z SHA-256, tak, jest do bani. I zmieniamy to na zalecany sposób php.
- Wstrzyknięcie SQL ma 17 lat. Dlaczego nadal istnieje?
- Czy przygotowane instrukcje są w 100% bezpieczne przed wstrzyknięciem SQL?