fi-ksi / web-backend

Backend for KSI web written in Python.
MIT License
8 stars 3 forks source link

Úlohy: přidat data_solution #126

Closed horacekj closed 3 years ago

horacekj commented 3 years ago
BorysekOndrej commented 3 years ago

Tak jsem se nad tím ještě zamyslel, a je v podstatě nemožné [1], aby frontend posílal Auth http hlavičku pro endpoint taskContent. Ten endpoint se používá na načítání obrázků, stahování souborů a vše mezi tím. Většina z toho jsou věci, obzvláště třeba obrázky, které vyvolává prohlížeč bez součinnosti Frontendu (resp. jakéhokoliv JS).

[1] Resp. pokud bychom to chtěli, museli bychom si v JS napsat/přibalit celý HTML parser a reversní proxy. Alternativou je includovat celý nový webový prohlížeč psaný v JS...

Jak jsem psal na messengeru, funkční alternativou Auth HTTP hlavičky může být pro tento endpoint cookie . (A nebo posílat Auth jak v HTTP hlavičce, tak v Cookie). Ideálně by měl mít kvůli bezpečnosti flagy httponly a secure.

Cookie otvírá několik bezpečnostních problémů, primárně CSRF. Příklad: Uživatel A je přihlášený. Útočník ho přesvědčí, aby navštívil stránku, do které vloží HTML tag, který má načíst obrázek z KSI webu. Obrázek se načte, protože uživatel je přihlášený. Útočník může načtený obrázek stáhnout z té načtené stránky a poslat si ho kamkoliv. A teď si představ, že místo načtení obrázku, se volá endpoint na smazání vlny. Máme nasazené CORS, ale to to nekryje úplně. Musel by sis tedy fakt pečlivě hlídat, že auth z cookie bereš pouze na endpointu taskDetails a odsouhlasit, že tím zůstane částečně výše uvedený příklad.

Kromě toho, že by to mělo být ohlídané na backendu, tomu lze trochu pomoct, když případnému cookie nastavíš Path parametr. Tím ho prohlížeč bude posílat jenom na ten jeden endpoint. Nevyřeší se tím ale záměrně malicious dotazy.

Suma sumárum, do frontendu nejsou třeba úpravy.

Velmi doporučuji se vrátit k návrhu, o kterém jsme se bavili, než jsi myslel, že je ten endpoint autentizovaný: Při zakládání úlohy automaticky vytvořit složku data_solution_XXXXXXXXXXXXXXXX, kde XXXXXXXXXXXXXXXX reprezentuje náhodně generovaný string.

Tohle je roky ozkoušený přístup, který se běžně používá. Například fotky posílané přes discord jsou zabezpečené jenom tím, že jejich ID je dostatečně dlouhé a náhodné. Messenger a další to dělají obdobně.

horacekj commented 3 years ago

Ona se ta složka může jmenovat klidně data_solution a až při deployi se nějak zamangluje jméno adresáře.

BorysekOndrej commented 3 years ago

To by bylo super, pokud to jde snadno. 👍

horacekj commented 3 years ago

Hotovo.