Kursy programowania dla początkujących mają do siebie to, że bardzo często uczą złych nawyków: używanie zmiennych globalnych, nazywanie funkcji po polsku, „using namespace” na wszystko w każdym nagłówku w C++, czy w ogóle programowanie w PHP. Ja wiem, że młody padawan chce jak najszybciej wyświetlić coś na ekranie i nie interesują go zbytnio kwestie bezpieczeństwa, utrzymania kodu czy optymalizacji jego pierwszego Kółko i Krzyżyk, ale czasem warto jednak pokazać mu „hej, tak się nie robi!”. Może to kwestia lenistwa autorów, może braku wiedzy, może przekonania, że „najpierw trzeba się nauczyć podstaw” – to temat na kiedy indziej.

Auto_increment nie jest sexy

Jedną z rzeczy o których nie wspomina się przy nauce MySql (czy innych baz danych, ale początkujący najczęściej wybierają MySql) jest niebezpieczeństwo używania kluczy z auto_increment. Powiedzmy, że mamy stronę na którą użytkownicy mogą wrzucać swoje prywatne pliki. Do każdego pliku można dostać się przez adres typu:

GET uploads/8172

Co jeśli sprytny user zmieni 8172 na 8171? Albo na 2817? Może mieć wgląd w cudze, prywatne dane. Nie o to nam chodziło.

To zresztą nie jedyne zagrożenie. Użytkownik wrzuca nowy plik który otrzyma ID np. 9182. Co mu to mówi? A no, że w bazie jest 9182 wpisów. Dla przeciętnego Janusza to mało przydatna wiedza, ale konkurencja może być zachwycona znając takie dokładne statystyki serwisu.

Co jeszcze? Można łatwo pobrać całą zawartość bazy, odpalając skrypt który zaczyna od id = 0 i idzie po id++ aż do 404. Tego też nie chcemy. Jak się zabezpieczyć?

 

Zaciemnianie ID

Jeśli mamy już bazę z kluczem z auto_increment i nie jesteśmy w stanie tego zmienić, możemy zaciemniać, szyfrować nasze ID. Jak to wygląda w praktyce? Przy użyciu http://hashids.org/ bardzo prosto:

Z ID 546 otrzymujemy całkiem inny ciąg znaków, który umieszczamy w URL a potem ponownie odszyfrowujemy – dziura w bezpieczeństwie załatana, hej! Sam hashids jest o tyle fajne, że ma porty do 31 różnych języków, każdy znajdzie coś dla siebie.

Generowanie niezależnych, niepowtarzających się ID

Spójrzmy na typowy adres filmiku na yt:

youtube.com/watch?v=_SBQvd6vY9s

Przy każdym nowym uploadzie najdajemy losowy ID zapisany w 11 znakach w base64 uprzednio sprawdzając jego dostępność. Te 11 znaków daje nam prawie 74 tryliony możliwości, a to wystarczająco, aby każdy człowiek na ziemi mógł przesyłać film co minutę przez 18 tysięcy lat. Fajnie, co?

 

Chociaż rozwiązania problemu są banalne, w internecie cały czas jest pełno stron z widocznym w adresie rosnącym ID:

http://pupnisko.pl/oferty/szczegoly/id/2922  (strona samorządowa, z naszych pieniędzy (!)) czy
http://ogloszenia.jelonka.com/index.php?mod=main&scr=one&id=1274771

Może jednak warto poruszyć ten temat, nawet jako ciekawostkę, w kursach i tutorialach?

  • Did you like it?
  • Yes   No