Kodowanie / zaciemnianie parametrów HTTP

Obecnie pracujemy nad bardzo prostą Webapp, i chcielibyśmy "zaciemniać" (Jaki byłby właściwy termin? ) lub zakodować w jakiś sposób parametr request, dzięki czemu możemy zmniejszyć szansę bezczynnego użytkownika na wysłanie dowolnych danych.

Na przykład url wygląda jak /webapp?user=Oscar&count=3

Chcielibyśmy mieć coś takiego jak: /webapp?data=EDZhjgzzkjhGZKJHGZIUYZT i mieć tę wartość dekodowaną na serwerze z rzeczywistą informacją o żądaniu.

Zanim sami przejdziemy do implementacji czegoś takiego (i pewnie robi to źle ) chciałbym wiedzieć, czy jest już coś do zrobienia?

Mamy Javę na serwerze i JavaScript na kliencie.

Author: OscarRyz, 2010-10-25

6 answers

Nie, Nie rób tego. Jeśli możesz zbudować coś w kodzie klienta, aby zaciemnić dane przesyłane z powrotem do serwera, to tak samo może to zrobić umyślny haker. Po prostu nie można ufać danych wysyłanych na serwer, bez względu na to, co robi twój oficjalny klient. trzymaj się ucieczki danych Klienta i walidacji ich z białą listą po stronie serwera . Użyj SSL i jeśli możesz, umieść parametry żądania w poście zamiast GET.

Expansion edit

Twoje zamieszanie wynika z celu zablokowania użytkownikom manipulowania danymi żądań, z koniecznością wdrożenia standardowych środków bezpieczeństwa. Standardowe środki bezpieczeństwa dla aplikacji internetowych obejmują wykorzystanie kombinacji uwierzytelniania, zarządzania uprawnieniami i sesjami, ścieżek audytu, walidacji danych i bezpiecznych kanałów komunikacji.

Używanie protokołu SSL nie uniemożliwia klientowi manipulowania danymi, ale uniemożliwia pośrednikom ich oglądanie lub manipulowanie nimi. Poucza też dobrze wychowanych przeglądarki nie buforują poufnych danych w historii adresów URL.

Wygląda na to, że masz jakąś prostą aplikację webową, która nie ma uwierzytelniania i przekazuje parametry żądań, które kontrolują ją bezpośrednio W GET, a zatem niektórzy nie-technicznie doświadczeni ludzie mogliby prawdopodobnie dowiedzieć się, że user=WorkerBee można po prostu zmienić na user=Boss w pasku przeglądarki, a tym samym mogą uzyskać dostęp do danych, których nie powinni widzieć, lub robić rzeczy, których nie powinni robić. twoje pragnienie (lub pragnienie klienta) zaciemnienia te parametry są naiwne, bo to tylko udaremni osobę najmniej doświadczoną technicznie. Jest to środek na wpół upieczony, a powodem, dla którego nie znalazłeś istniejącego rozwiązania, jest to, że nie jest to dobre podejście. Lepiej poświęcić czas na wdrożenie przyzwoitego systemu uwierzytelniania ze ścieżką audytu (i jeśli rzeczywiście tak robisz, Oznacz odpowiedź Gary ' ego jako poprawną).

Więc, aby zakończyć to:

  1. Bezpieczeństwo przez zaciemnienie nie jest bezpieczeństwo w wszystkie.
  2. You can ' t trust dane użytkownika, nawet jeśli są zasłonięte. zweryfikuj swoje dane.
  3. używanie bezpiecznych kanałów komunikacyjnych (SSL) pomaga blokować inne powiązane zagrożenia.
  4. Ty powinien porzucić swoje podejście i zrobić słuszna rzecz. Właściwe, w twoja sprawa, prawdopodobnie oznacza dodanie mechanizm uwierzytelniania z system przywilejów uniemożliwiający użytkownikom z dostępu do rzeczy, których nie są na tyle uprzywilejowane, aby zobaczyć-w tym rzeczy, do których mogą próbować uzyskać dostęp przez manipulowanie z parametrami GET. Gary Odpowiedź R , a także komentarz Dave ' a i Willa hit ten w głowę.
 27
Author: Mike Atlas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:09

Jeśli twoim celem jest "zmniejszenie szansy bezczynnego użytkownika na wysyłanie dowolnych danych", jest inne prostsze podejście, którego bym spróbował. Utwórz prywatny klucz szyfrowania i przechowuj go po stronie serwera aplikacji. Za każdym razem, gdy aplikacja generuje adres url, Utwórz skrót adresu url przy użyciu prywatnego klucza szyfrowania i umieść ten skrót w ciągu zapytania. Za każdym razem, gdy użytkownik żąda strony z parametrami w adresie url, Przelicz hash i sprawdź, czy pasuje. To da ci pewność, że Twoje aplikacja obliczyła adres url. To pozostawi parametry ciągu zapytania czytelne choć. W pseudo-kodzie,

SALT = "so9dnfi3i21nwpsodjf";

function computeUrl(url) {
  return url + "&hash=" + md5(url + SALT );
}

function checkUrl(url) {
  hash = /&hash=(.+)/.match(url);
  oldUrl = url.strip(/&hash=.+/);
  return md5(oldUrl + SALT ) == hash;
}
 10
Author: Dave Aaron Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-25 23:06:28

Jeśli próbujesz ograniczyć dostęp do danych, użyj pewnego rodzaju mechanizmu logowania z ciasteczkiem dostarczającym pojedynczy znak na kluczu uwierzytelniania. Jeśli klient wyśle plik cookie z kluczem, może manipulować danymi zgodnie z władzami powiązanymi z jego kontem (administrator, użytkownik publiczny itp.). Wystarczy spojrzeć na Spring Security, CAS itp., Aby uzyskać łatwe w użyciu implementacje tego w Javie. Tokeny zawarte w pliku cookie są zwykle szyfrowane kluczem prywatnym wydającego serwera i są zazwyczaj odporne na manipulacje.

Alternatywnie, jeśli chcesz, aby Twój publiczny użytkownik (nieautoryzowany) mógł opublikować niektóre dane na swojej stronie, wszystkie zakłady są wyłączone. Musisz potwierdzić po stronie serwera. Oznacza to ograniczenie dostępu do określonych Uri i upewnienie się, że wszystkie dane wejściowe są wyczyszczone.

Złota zasada tutaj jest zakazać wszystkiego, z wyjątkiem rzeczy, które wiesz, że są bezpieczne.

 5
Author: Gary Rowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-26 15:59:05

Jeśli celem jest zapobieganie manipulowaniu "statycznymi" adresami URL, możesz po prostu zaszyfrować parametry lub podpisać je. Prawdopodobnie jest to "wystarczająco bezpieczne", aby zweryfikować MD5 parametrów URL, wraz z odrobiną soli. Sól może być przypadkowym ciągiem przechowywanym w sesji, powiedzmy.

Wtedy możesz po prostu:

http://example.com/service?x=123&y=Bob&sig=ABCD1324

Ta technika ujawnia dane (tzn. mogą "zobaczyć", że xyz=123), ale nie mogą zmienić danych.

Jest zaleta "szyfrowania" (i używam tego termin luźno). W tym miejscu zaszyfrowujesz całą sekcję parametrów adresu URL.

Tutaj możesz zrobić coś takiego:

http://example.com/service?data=ABC1235ABC

Fajną rzeczą w używaniu szyfrowania jest dwukrotność.

Jeden chroni dane (użytkownik nigdy nie widzi, że xyz=123, na przykład).

Inną cechą jest to, że jest rozszerzalna:

http://example.com/service?data=ABC1235ABC&newparm=123&otherparm=abc

Tutaj możesz odszyfrować oryginalny ładunek i wykonać (bezpieczne) połączenie z nowymi danymi.

Tak więc żądania mogą dodawać dane do żądania, tylko nie zmieniaj istniejących danych.

Możesz zrobić to samo za pomocą techniki podpisywania, wystarczy skonsolidować całe żądanie w jednym "obiekcie blob" , A Ten obiekt blob jest niejawnie podpisany. To jest" skutecznie " zaszyfrowane, tylko słabe szyfrowanie.

Najwyraźniej nie chcesz tego robić na kliencie. Nie ma sensu. Jeśli możesz to zrobić, " oni "mogą to zrobić i nie widać różnicy, więc równie dobrze możesz tego w ogóle nie robić-chyba że chcesz "zaszyfrować" dane na normalnym Port HTTP (vs TLS, ale wtedy ludzie będą mądrze zastanawiać się "po co się martwić").

Dla Javy, cała ta praca idzie w filtrze, tak to zrobiłem. Tylny koniec jest odizolowany od tego.

Jeśli chcesz, możesz całkowicie odizolować back end z filtrem wychodzącym, który obsługuje szyfrowanie/podpisywanie URL po wyjściu.

To też zrobiłem. Minusem jest to, że jest bardzo zaangażowany, aby to zrobić dobrze i wydajnie. Potrzebujesz lekkiego parsera HTML aby wyciągnąć adresy URL(napisałem Parser strumieniowy, aby zrobić to w locie, aby nie skopiował całej strony do pamięci RAM).

Jasną stroną jest to, że cała strona treści "po prostu działa", ponieważ oni nic o tym nie wiedzą.

Istnieje również specjalna obsługa JavaScript (ponieważ twój filtr nie będzie łatwo "wiedział", gdzie znajduje się adres URL do zaszyfrowania). Rozwiązałem to wymagając, aby adresy URL były podpisywane jako " var signedURL="....'", więc mogę je łatwo znaleźć w wyjściu. Nie tak miażdżące obciążenie dla projektantów, jak mogłoby się wydawać.

Drugą jasną stroną filtra jest to, że możesz go wyłączyć. Jeśli masz jakieś "dziwne zachowanie" dzieje, po prostu wyłączyć. Jeśli zachowanie będzie kontynuowane, znajdziesz błąd związany z szyfrowaniem. Pozwala również programistom pracować w zwykłym tekście i pozostawić szyfrowanie do testowania integracji.

[3]}Ból do zrobienia, ale ogólnie jest miło w końcu.
 3
Author: Will Hartung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-25 19:29:23
 1
Author: oimoim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-25 19:08:57

Możesz kodować dane za pomocą base64 lub czegoś podobnego. Kodowałbym argumenty inself w JSON, aby je serializować.

 0
Author: Florian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-25 18:54:44