Dank Ward voor de extra puzzelstukjes!
Ik werk met PostgreSQL, en heb in de module uuid-ossp de functie
uuid_generate_v5() gevonden.
Op het moment van schrijven is het nog vroeg, en ik zit nog aan de koffie, wat kan verklaren dat ik nog niet meteen de oplossing zie voor mijn applicatie om per sessie aparte ID's te maken. Ik denk even hardop terwijl ik typ:
- ik heb een lijst van actieve sessie ID's,
- daarnaast heb ik een paar schema's, met daarin verschillende tabellen met daarin allemaal rijen. De meeste rijen hebben een PK bestaande uit een bigint, sommige rijen hebben als PK een FK naar een andere tabel. Sommige tabellen zijn koppeltabellen met PK's bestaande uit ID's van meerdere tabellen. Daarbij heb ik natuurlijk ook gewone tabellen met PK's die uit meerdere ID's bestaan.
Wat ik nu doe is die ID's naar de browser sturen. Lekker makkelijk, maar dat wordt gezien als een 'direct object reference' of DOR. Je ziet niet het kenteken of EAN, alleen de integer van de database die wordt gegenereerd door een SEQUENCE van de tabel.
(Wanneer autorisatie goed is geregeld, is er feitelijk geen sprake van IDOR, want het is niet Insecure. Tenzij het hebben van DOR gelijk wordt geschakeld als Insecure. Maar daar gaat het nu niet over.)
De beste oplossing zou zijn om UUID's versie 5 te genereren per sessie. Mijn eerste gedachte is dat ik naast een sessie-tabel ook een "sessie_uuid" tabel moet hebben waarin per sessie gegenereerde UUID's heb.
Maar welke info gebruik je als
namespace, en welke als
name om de mapping naar de verschillende schema's, tabellen en rijen voor elkaar te krijgen?
Om de UUID's uniek te krijgen zou de sessie ID als namespace moeten dienen.
Dan zit ik nog met de mapping. Gezien dat het aantal schema's lager is dan 64, het aantal tabellen per schema lager dan 64, en het aantal rijen niet groter wordt dan 64-bit, zou dat getal als name kunnen dienen in de 128 bit van een UUID.
Alleen is het dan nog steeds Insecure als het lagere deel van een UID constant is.
Dan is de enige oplossing die ik zie om de name random te maken, en in de "sessie_uuid" tabel ook de namen van de schema's, kolommen, en ID's op te nemen als JSON... ofzo.
Ik heb het idee dat ik het wiel opnieuw zit uit te vinden, dit moet toch beter kunnen?
[size=xsmall]
Toevoeging op 14/06/2024 07:17:51:[/size]
[Een dag later..]
Na een poosje mijmeren ben ik tot de conclusie gekomen dat hoewel sessies worden opgeslagen in de database, de database zelf niet de plek is om het probleem op de lossen. Want de applicatieserver communiceert met de browser, dat is de laag die beveiligd moet worden omdat de applicatieserver de sessies regelt.
Ik heb nu twee plaatsen bedacht waar IDOR op zou kunnen treden.
In URLs en in namen van HTML-formuliervelden.
URL's worden aangemaakt via een functie, die dan net zo goed de URL parameters per sessie in een tabel kan opslaan, met een UUID als ID. Wanneer de URL met UUID wordt gebruikt kan de front controller de parameters weer ophalen en zit er niets waardevols in de browser.
En hetzelfde geldt voor namen van velden in formulieren. Gewoon met een key-value store.
Ik heb me nog afgevraagd of daarvoor een in-memory engine nodig zou zijn in PostgreSQL.
Maar na het lezen van
deze SO thread en het feit dat de servers elk 32 GB RAM hebben, denk ik niet dat het verschil zal maken.
Dank voor het meedenken, ik ben toe aan implementatie. Maar eerst het weekeinde!