Jak zabezpieczyć się przed iteracją przeglądania stron po ID?

securityNierzadko w naszych systemach, czy zwykłych stronach internetowych stosujemy wyświetlanie zawartości na podstawie identyfikatora w postaci liczby naturalnej. Numerowi temu odpowiada id rekordu w bazie danych, kontroler na jego podstawie pobiera odpowiedni obiekt a widok wyświetla zawartość. Czasem jednak chcielibyśmy zabezpieczyć możliwość szybkiego spreparowania odnośnika żeby utrudnić zadanie botowi iterującemu po kolejnych numerach i pobierającego zawartości podstron.
Pamiętam okres popularności serwisu nasza-klasa.pl. W tym czasie przygotowałem właśnie takiego bota, dzięki któremu mogłem zgromadzić sporą ilość danych właśnie dzięki opisywanej podatności.

Jak się zabezpieczyć?

Możemy wyróżnić dwie techniki:

  1. Hashowanie id
  2. Szyfrowanie id

Tym razem przykłady w PHP.

Hashowanie id

Zabezpieczenie polega na:

  1. Zdefiniowaniu tajnego kodu (salt)
  2. Wygenerowaniu hasha kryptograficzną funkcją skrótu na podstawie identyfikatora i wcześniej wygenerowanego tajnego kodu.
  3. Dodania do odnośnika wygenerowanego hasha.
  4. Przy próbie żądania pobrania strony:
    1. Generujemy hash dla identyfikatora.
    2. Sprawdzamy zgodność hasha z hashem przesłanym jako dodatkowy parametr odnośnika.
    3. Jeśli hashe są zgodne, umożliwiamy pobranie zawartości strony.

Przykład:

W tym momencie nasz hash przyjmuje wartość: 574f5a4283177dad9dcee8ae8cc7512c i generujemy odnośnik do strony w postaci:
?id=12345&hash=574f5a4283177dad9dcee8ae8cc7512c

Weryfikacja w kontrolerze:

Dzięki temu próba zmiany wartości id w odnośniku nie umożliwi nam podglądu zawartości strony, ze względu na niezgodność hashy.

 

Szyfrowanie id

Kolejnym rozwiązaniem może wykorzystanie symetrycznego  klucza do zakodowania identyfikatora i możliwości jego odkodowania.

Nasz zakodowany id będzie miał wartość: Doj2VqhSe4k%3D i tym razem w odnośniku umieszczamy tylko jedną wartość:
?id=Doj2VqhSe4k%3D

Odkodowanie id w kontrolerze:

 

To również może Cię zainteresować:

  • Hasła maskowane – błędy implementacyjne polskiego bankuHasła maskowane – błędy implementacyjne polskiego banku Ten tydzień zapisze się w historii polskiego internetu i bankowości za sprawą włamania do jednego z polskich banków. Jak podaje Zaufana Trzecia Strona przebieg wydarzeń wyglądał […]
  • Wordpress i bezpieczeństwoWordPress i bezpieczeństwo Tę stronę renderuje WordPress. Nie da się tego ukryć - analizując źródła html, javascript czy style css szybko można to wywnioskować. Skoro tak łatwo zidentyfikować framework który został […]
  • Hasła maskowane ciąg dalszyHasła maskowane ciąg dalszy Pod ostatnim artykułem dotyczącym wpadki jednego z polskich banków pojawił się komentarz: Czy autor ma JAKIEKOLWIEK pojecia jak sa implementowane takie maski ? Z technicznego punktu […]
  • Napisz kod i wygraj dronKonkurs PHP – napisz kod i wygraj drona za $400 Znalazłem dzisiaj w sieci ciekawy konkurs php, dzięki któremu można wygrać drona za ok. $400. Zadanie polega na napisaniu ciekawego kodu w PHP mieszczącego się w 45 liniach kodu z […]
  • Zbiór przykładów programistycznych w różnych językachZbiór przykładów programistycznych w różnych językach Poniżej interesująca lista odnośników do rozwiązań kilkuset zadań programistycznych w różnych językach programowania: 1 100 doors 2 24 game 24 game/Solve 9 9 […]
  • PHP i podobieństwo dwóch wyrazówPHP i podobieństwo dwóch wyrazów Trafiłem ostatnio na ciekawą sytuację. Blisko dziewięć lat temu napisałem system dla zarządzania awizacjami kierowców w magazynach dla największego w Polsce producenta wody. System do dziś […]

2 thoughts on “Jak zabezpieczyć się przed iteracją przeglądania stron po ID?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *