Wątek przeniesiony 2024-05-21 01:04 z Webmastering przez furious programming.

Dostęp do danych innego użytkownika

0

Mam taką klasę w widoku django:

class PageView(View):
    def get(self, request, document_id, page_number):
        page = get_object_or_404(Page, document_id=document_id, page_number=page_number)
        document = page.document

        if document.private and document.user != request.user:
            return HttpResponseForbidden("You don't have permission to access this document.")
        
        return FileResponse(open(page.image.path, 'rb'), content_type='image/png')

Powinna blokować dostęp do danych pod tą ścieżką, w sensie nie można podejrzeć dokumentów innego użytkownika zmieniając document_id w adresie url.

path('document/<uuid:document_id>/pages/<int:page_number>/', views.PageView.as_view(), name='page_view'),

Jak sprawdzić taką funkcjonalność, gdy nie mam jeszcze domeny, serwera ani zaimplementowanego logowania z rejestracją i uruchamiam apke w środowisku deweloperskim?

2

Możesz sobie tam jakiś serwer testowy odpalić na localhost?

2

Jak sprawdzić taką funkcjonalność, gdy nie mam jeszcze domeny, serwera

Wystartować aaplikację lokalnie jak mówi @lion137

ani zaimplementowanego logowania z rejestracją

Dodać użytkowników "ręcznie na bazie". Można insertem, można za pomocą repozytoriów dla użytkowników

1
  1. W django masz komende

    python manage.py create createsuperuser
    

    https://docs.djangoproject.com/en/5.0/ref/django-admin/#createsuperuser

    utworzysz sobie super usera (który jest jak każdy inny użytkownik tylko ma flagę włączoną i możesz się bawić.

  2. W Django masz aumtatycznie generowanego admina, gdzie sobie wyklikasz użytkowników itp w pare sekund https://docs.djangoproject.com/en/5.0/ref/contrib/admin/

0

@lion137 @KamilAdam co macie na myśli przez wystartowanie aplikacji lokalnie? Z poziomu VSC odpalam localhost w konsoli komendą

python manage.py runserver

i mogę się bawić, tylko jak zasymulować lokalne połączenie się do apki przez 2 różnych użytkowników skoro nie ma logowania i ip się nie zmienia 😛

@szok dzięki, przejrzę linki, obawiam się tylko, że superuser może wszystko i nie będzie to taka symulacja 1:1 jaka mogłaby wydarzyć się na produkcji

1

Jak się zalogujesz do aplikacji to ona zwróci ci ciastko z sesją.

Możesz spróbować z błędną sesją wejść na stronę, z sesją innego użytkownika i z sesją użytkownika co ma uprawnienia do przeglądania danego zasobu.

Z curl możesz zrobić curl -v --cookies "TokenKtóryDostałeśPoZalogowaniu" http://127.0.0.1:port/

W django możesz użyć do tego narzędzi.
Do przygotowywania testów http.
https://docs.djangoproject.com/en/5.0/topics/testing/tools/
Powinieneś poczytać, bo to są raczej proste rzeczy, chyba że wszystko chatGPT generujesz i na około nie rozumiesz jak działają poszczególne elementy.

2
mitowski napisał(a):

@lion137 @KamilAdam co macie na myśli przez wystartowanie aplikacji lokalnie? Z poziomu VSC odpalam localhost w konsoli komendą

python manage.py runserver

i mogę się bawić, tylko jak zasymulować lokalne połączenie się do apki przez 2 różnych użytkowników skoro nie ma logowania i ip się nie zmienia 😛

Ty chcesz identyfikować użytkownika po ip? nie słyszałem o takim rozwiązaniu. Użytkownik zwykle jest identyfikowany po tokienie który dostał

0

Chyba muszę doprecyzować, uruchamiam apke lokalnie, tworzy się sesja do której przypisywany jest token dostępu. Najpierw podłączyłem się do niej na przeglądarce chrome uzyskałem token1, załadowałem plik, przypisał do niego unikalny document_id w bazie. Następnie powtórzyłem ten proces na przeglądarce edge, odpaliła się nowa sesja uzyskałem token2, załadowałem inny plik, przypisał kolejny document_id.

Naprzemiennie zmieniałem adresy url na obu przeglądarkach, w chrome wrzuciłem document_id z edge i odwrotnie. Funkcjonalność nie działa jak powinna, nie blokuje dostępu między różnymi sesjami i teraz nie wiem czy procedura testowa jest nieprawidłowa czy napisana funkcjonalność jest do bani. Może teraz zrozumiecie o co mi chodzi 😛

@KamilAdam aplikacja będzie obsługiwać użytkowników anonimowych i zarejestrowanych. Anonimowego nie zidentyfikuje po emailu, łapie go po tokenie sesji i ip

0

@mitowski Obstawiam, że document.private zawsze daje false i dlatego jest problem. Jak już wspomniano, napisz testy. Jak tak strasznie boisz się testów, podepnij debugger. Jak nie umiesz to chociaż zrob print/log i zobacz co ci w zmiennych siedzi i na "chłopski rozum" sobie ogarnij. Jednakowoż ja bym zaczął od zaprzyjaźnienia się z testami.

0

Dzięki za pomoc. Czyli dobrze sprawdzałem tą funkcjonalność podsumowując wasze wskazówki, po prostu kole w oczy, że manualnie. Pierwszy raz robię apke webową i wiele rzeczy uczę się w trakcie. Mając 1-2 godziny wieczorami raczej nie poszaleje z testami, a dłubie kod kilka miesięcy i jeszcze wiele mu brakuje …

1

@mitowski Pewnie, mając tylko 1-2h ja też bym wolał w kółko przeklikiwac się przez aplikację i poraz setny ustawiać jakieś zmienne, niż poświęcić 15min(jeśli nie wiem jak, albo 5min jak wiem) na napisanie testu, który jutro będzie działać tak samo i da mi informacje, że już coś w ten sposób testowałem i nie muszę kolejny raz tego robić. Bo w natłoku myśli po całym dniu, nie pamiętam co robiłem wczoraj. Ale ja jestem prostym człowiekiem, gdzie mi do geniuszu

1 użytkowników online, w tym zalogowanych: 0, gości: 1