Frage zu Sicherheit beim Zugriff auf Seiten

Django, Flask, Bottle, WSGI, CGI…
Antworten
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Die Lehrkraft (ich will nicht immer "die Lehrerinn bzw. der Lehrer" schreiben), kann die Aufgaben selbst ausprobieren und natürlich auch eine Übersicht dieser Aufgaben anzeigen lassen, sie kann auch die Arbeiten der ganzen Lerngruppe (das war mein letztes Posting) anzeigen lassen, aber auch noch die Arbeitsergebnisse jeder einzelnen Schülerin bzw. jeder/s einzelnen (S/S). Dazu gibt es verschiedene Möglichkeiten. Z.B. kann sie ein Protokoll der letzten Aufgaben aufrufen. Dazu übergebe ich bei Klick die id von S/S z.B. "... protokoll/13/". Nun darf aber natürlich nur der/die S/S sein/ihr Protokoll einsehen und niemand, der einfach ids ausprobiert. Erschwerend kommt hinzu, dass die Lehrkraft andere Berechtigungen hat, sie darf z.B. ihre eigenen Arbeitsergebnisse löschen, die der/des S/S nicht. Dazu habe ich jetzt z.B. im view vom Protokoll eine Abfrage eingebaut, die so aussieht:

Code: Alles auswählen

def protokoll(req, schueler_id=0):
    if req.user.is_authenticated:
        if User.objects.filter(pk=req.user.id, groups__name='Lehrer').exists():
            lehrer = True
        else:
            lehrer = False
        loeschen = False 
        if schueler_id == 0:
            user = get_object_or_404(Profil, user_id = req.user.id)
            if lehrer:
                loeschen = True            
        else:
            user = get_object_or_404(Profil, id = schueler_id)
        protokoll = Protokoll.objects.filter(user=user).order_by('id').reverse()
        if(user.id) != (req.user.profil.id) and (user.gruppe.lehrer.id) != (req.user.id):
          return HttpResponse("Zugriff verweigert")
          ...
Was besseres ist mir nicht eingefallen. Macht das so Sinn oder habt ihr da andere Ideen?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist ziemlich unübersichtlich, weil der Code so viele Wege gehen kann. Deshalb ist es wichtig, dass die Bedingungen möglichst klar aufeinander aufbauen:

Code: Alles auswählen

def protokoll(req, schueler_id=0):
    if req.user.is_authenticated:
        if schueler_id == 0:
            user_profil = req.user.profile
        else:
            user_profil = get_object_or_404(Profil, id=schueler_id)
        ist_mein_profil = user_profil.user.id == req.user.id
        ist_mein_schueler = user_profil.gruppe.lehrer.id == req.user.id
        if not (ist_mein_profil or ist_mein_schueler):
            return HttpResponse("Zugriff verweigert")
        darf_loeschen == ist_mein_profil and ist_mein_schueler
        protokolle = Protokoll.objects.filter(user=user).order_by('id').reverse()
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Danke dafür! Das heißt aber, im Prinzip macht man das so?
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Pitwheazle hat geschrieben: Donnerstag 19. Januar 2023, 16:47 Dazu übergebe ich bei Klick die id von S/S z.B. "... protokoll/13/". Nun darf aber natürlich nur der/die S/S sein/ihr Protokoll einsehen und niemand, der einfach ids ausprobiert.
Pitwheazle hat geschrieben: Donnerstag 19. Januar 2023, 21:51 im Prinzip macht man das so?

Das ist schon ein übliches Problem und gut, dass du auch dahingehend prüfen willst.
Wie "man" das macht hängt immer ein bisschen davon ab, wovor man sich schützen will.
Gerade im Bereich der Schule mit solchen hochsensiblen Daten muss man sehr penibel sein.
Du kannst dir bei Gelegenheit ja mal einige passende Einträge im Blog der Zerforschung durchlesen.
Gerade im letzten Jahr haben sie so einige Schul-Apps analysiert und konnten teilweise eklatante Lücken öffnen.
Wenn auf diese Art dann unberechtigte Personen da schützenswerte Daten heraustragen können, ist der Ärger vorprogrammiert.

Also ja, grundsätzlich solltest du alle Anfragen der Nutzer immer nochmal auf dem Server gegenprüfen: Dürfen die das wirklich sehen/machen.
Nicht nur einfach irgendwas durchwinken, bloß weil da jemand die richtige ID kennt und nennt, denn die kann man ggf. einfach raten.

Außerdem gibt es die Möglichkeit, die URL anders aufzubauen, dass da gar nicht die echte ID steht und nicht "protokoll" als Name.
Du kannst dir ja mal ansehen, wie andere Webseiten dieses Thema handhaben, je nachdem welche Daten wie zu schützen sind.
Beispielsweise dieses Forum schreibt in der URL auch bloß "viewtopic.php?t=56304" und das ist die Nummer von diesem Thread.
Wenn man da eine andere Zahl einträgt, kommt man direkt in einen anderen Thread (wenn er denn existiert) (und du ihn sehen darfst)
Hingegen bei deiner Bank wird kaum in der URL stehen "konto=123&inhaber=Pitweazle", was übrigens leicht mitgehört werden kann.
Da steht dann eher so unverständliches Kauderwelsch wie "token=us8123nfs" und das gilt dann auch nur für diese eine Anfrage jetzt.

Das Thema "Sicherheit von Zugriff auf Webseiten" ist ein weites Feld und es gibt viele handfeste Empfehlungen, was sich bewährt hat.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Pitwheazle
User
Beiträge: 873
Registriert: Sonntag 19. September 2021, 09:40

Kebap hat geschrieben: Freitag 20. Januar 2023, 11:29 Das Thema "Sicherheit von Zugriff auf Webseiten" ist ein weites Feld und es gibt viele handfeste Empfehlungen, was sich bewährt hat.
Hast du denn eine für mich? Ich habe etwas Bedenken, ob ich auch keinen Zugang übersehe.
Antworten