Jak validovat DTO v dynamicky typovaném jazyce?

Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #15 kdy: 23. 01. 2022, 14:10:24 »
Hele a neexistuje nejaky zpusob jak zabezpecit, ze requesty do API budu dostavat vzdycky jen z moji webove stranky? Jako vyrobit nejakou md5 sumu zdrojoveho kodu webovky, nebo co ja vim.
To asi nejde z principu, proto se vždy vše validuje (někdy duplicitně) na serveru.

Nejake veci udelat jdou:

https://stackoverflow.com/questions/13895679/how-do-i-secure-rest-api-calls

Napr. mit mapu ip + headers z weboveho prohlizece, kterym jsem poslal webovku, a jen jim dovolit delat requesty. Obejit to lze, ale na domaci pouziti by to mohl byt dostatecny stupen ochrany.
« Poslední změna: 23. 01. 2022, 14:11:55 od registrovany123 »


Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #16 kdy: 23. 01. 2022, 14:32:19 »
Hele a neexistuje nejaky zpusob jak zabezpecit, ze requesty do API budu dostavat vzdycky jen z moji webove stranky? Jako vyrobit nejakou md5 sumu zdrojoveho kodu webovky, nebo co ja vim.
To asi nejde z principu, proto se vždy vše validuje (někdy duplicitně) na serveru.
Nejake veci udelat jdou:

https://stackoverflow.com/questions/13895679/how-do-i-secure-rest-api-calls

Napr. mit mapu ip + headers z weboveho prohlizece, kterym jsem poslal webovku, a jen jim dovolit delat requesty. Obejit to lze, ale na domaci pouziti by to mohl byt dostatecny stupen ochrany.
Jasně, jde to ztížit, ale je třeba vycházet z toho, co tam nakonec píšou: “I consider it impossible to make it completely impossible for an abuser to consume your service.”

IMHO pro většinu webových aplikací stačí běžná míra zabezpečení (timeouty, omezení velikost přenášených dat, API klíče/OAuth2 podle charakteru služby), nejlépe přes nějakou osvědčenou reverse proxy.

Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #17 kdy: 23. 01. 2022, 16:17:35 »
K puvodnimu dotazu: I v dynamicky typovanych jazycich existuji nastroje a knihovny pro validaci potecnialne neduveryhodnych/libovolne rozbitych dat ziskanych zvenci a pouzitim jakehokoliv jazyka nebo databaze se te validaci clovek nevyhne. At uz to znamena neco jako JSONSchema, nebo knihovna kde se definice typu uvnitr requestu popise v kodu. S JavaScriptem bohuzel neumim poradit, ale treba v Pythonu se daji s vyhodou vyuzit typove anotace a validaci odvodit od nich. Rozhodne nemuzu ale souhlasit s nazory kolegu co nevideli nic jineho nez Javu, ze by dynamicky typovane jazyky byly v necem menecenne -- tak jako u te Javy to je cele o zkusenostech, peclivosti a schopnosti si najit spravne nastroje ktere cloveku usetri praci. Prasarny se daji delat bez ohledu na jazyk...

L..

  • ****
  • 302
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #18 kdy: 23. 01. 2022, 16:50:16 »
Hele a neexistuje nejaky zpusob jak zabezpecit, ze requesty do API budu dostavat vzdycky jen z moji webove stranky?

Ne. Protože klient (prohlížeč) běží na počítači druhé strany a ta ho v principu ho dokáže přinutit poslat cokoli.

A jinak teda i staticky typované jazyky mohou být zrádné, třeba Java trpí na type erasure u generických kolekcí. Sice v kódu je List<String>, ale runtime se tam dá podstrčit třeba Number a projde to.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #19 kdy: 23. 01. 2022, 17:28:12 »
A jinak teda i staticky typované jazyky mohou být zrádné, třeba Java trpí na type erasure u generických kolekcí. Sice v kódu je List<String>, ale runtime se tam dá podstrčit třeba Number a projde to.
To je ovšem chyba Javy, ne statického typování.


anonacct

Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #20 kdy: 23. 01. 2022, 17:40:40 »
Data musíš validovat vždycky, je úplně jedno jaký jazyk nebo DB používáš. Není tady moc o čem mluvit, nějaké schéma tam budeš muset mít a na základě něho validovat vstupy. Nikdy neukládej do DB jen tak co ti někdo pošle na endpoint bez validace. To je red flag.

L..

  • ****
  • 302
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #21 kdy: 23. 01. 2022, 19:43:51 »
To je ovšem chyba Javy, ne statického typování.

Pokud v mém příspěvku vidíte něco o chybě statického typování, pravděpodobně máte v počítači virus, který vám mění HTML stránky. Já tam nic takového nepsal.

Jen jsem upozorňoval, že ani ve staticky typovaných jazycích se nelze typovou kontrolu vždy použít místo validace a je tedy lepší použít k tomu určenou knihovnu.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #22 kdy: 23. 01. 2022, 23:38:10 »
Jenze. Opravte me jestli se mylim, ale ja budu muset zvalidovat pritomnost a delku kazdeho jednoho fieldu tak, jako by to pro me udelalo napr. preddefinovane DTO v Jave a preddefinovana tabulka v Relacni databazi. Protoze jinak by mohl nejaky hacker do endpointu order poslat 100gb nesmyslu a zahltit mi databazi.

Takze kdyz jsem si chtel na zacatku ulehcit praci a pouzit dynamicky typovany jazyk a MongoDB, tak nakonec budu muset stejne delat to, co by pro me delal staticky typovany jazyk a Relacni databaze k tomu.

Nebo mi neco nedochazi?

Je to otázka rétoriky.

Čistě fakticky: chceš validovat? (blbá otázka) Takže budeš muset validovat. Je vcelku buřt jakým způsobem.

Když si pozorně přečteš, co jsi napsal, tak tam nikde nenajdeš, že by ti staticky typovaný jazyk nějak zázračně všechno automaticky validoval. Databáze detto. Ty tam píšeš, že ti to bude dělat staticky typovaný jazyk, protože v něm to musíš nadefinovat, jazyk ti to nutí (tiše předpokládám, že tam navíc máš nějakou reflexi nebo podobnou chytristiku, aby si nemusel psát tu samou validaci jen kvůli tomu, aby ti to sedlo na typy). A stejně si to musíš nadefinovat v tom javascriptu. Není v tom žádný zvláštní rozdíl.

Vypíchl bych tři detaily:

1/ Používáš-li relační databázi, nebo staticky typovaný jazyk, tak máš jakési povědomí o validaci, o tom, že do varcharů se čísla neukládají (zdravím MySQL), etc. Takže tě to napadne, že tam tu validaci budeš potřebovat, že by tam asi měla být.

2/ Statické jazyky, zvláště takové debilní jako je Java nebo C# v praxi dopadají často tak, že tam tu validaci máš dvakrát třikrát, protože jednou na vstupu, podruhé při mapování na DTO, třetí ve formulářích, čtvrté při mapováná do Hibernate, páté ve vlastní databázi...
V dynamickém jazyce jako je Javascript obvykle validaci nemáš vůbec. Protože bod 1. Ale když už to dělá nějaký senior, tak to udělá chytře, definuje si pravidla jednou, a pak je posílá všude kam potřebuje.

3/ Staticky typované jazyky mají úplně jinou motivaci než validaci dat, i když i na to se samozřejmě dají použít (nebo tam překáží).


Disclaimer: Jsem fanatický příznivce a zastánce staticky typovaných jazyků a nenávidím dynamicky typované. To mi však nebrání vidět jasně.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #23 kdy: 23. 01. 2022, 23:52:04 »
Statické jazyky, zvláště takové debilní jako je Java nebo C# […] Jsem fanatický příznivce a zastánce staticky typovaných jazyků a nenávidím dynamicky typované.
To zní dost drsně. A ani to moc nechápu, není mnohem zásadnějším rozdílem silné vs. slabé typování?

Kit

  • *****
  • 704
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #24 kdy: 24. 01. 2022, 00:32:44 »
To je fakt velký problém, když uživatel místo názvu ulice uvede číslo domu nebo když číslo domu není integer? Typování dat od uživatele mi nedává smysl. Validace ano, ale typování ne.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #25 kdy: 24. 01. 2022, 01:10:21 »
Statické jazyky, zvláště takové debilní jako je Java nebo C# […] Jsem fanatický příznivce a zastánce staticky typovaných jazyků a nenávidím dynamicky typované.
To zní dost drsně. A ani to moc nechápu, není mnohem zásadnějším rozdílem silné vs. slabé typování?
To jsme tu už rozebírali.
Silné vs slabé typování je defakto banalita, nestojící za polemiku. Skutečnost, že se mi Javascript snaží automaticky konvertovat cokoliv podobného číslu na číslo má sice vliv na programátorský prožitek, ale že by z toho musela být extra kategorie si nemyslím. Takže má odpověď zní - ne, vůbec. V praxi silné typování nic zásadního nepřináší.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #26 kdy: 24. 01. 2022, 01:16:22 »
Statické jazyky, zvláště takové debilní jako je Java nebo C# […] Jsem fanatický příznivce a zastánce staticky typovaných jazyků a nenávidím dynamicky typované.
To zní dost drsně. A ani to moc nechápu, není mnohem zásadnějším rozdílem silné vs. slabé typování?
To jsme tu už rozebírali.
Silné vs slabé typování je defakto banalita, nestojící za polemiku. Skutečnost, že se mi Javascript snaží automaticky konvertovat cokoliv podobného číslu na číslo má sice vliv na programátorský prožitek, ale že by z toho musela být extra kategorie si nemyslím. Takže má odpověď zní - ne, vůbec. V praxi silné typování nic zásadního nepřináší.
Silné typování nijak zvlášť nesouvisí s JS. Ostatně i dynamicky typovaný jazyk může mít například záv. typy.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #27 kdy: 24. 01. 2022, 02:27:43 »
Silné typování nijak zvlášť nesouvisí s JS.
Nic takového jsem netvrdil. JS byl uveden jen jako příklad.


Ostatně i dynamicky typovaný jazyk může mít například záv. typy.


Možná se každý bavíme o něčem jiném. Možná si pod silným typováním představuji něco špatně.

K čemu by byly dobré, u nějakého dynamicky typovaného jazyka, závislostní typy? Jaký by měli přínos?

Vycházím z, možná nesprávného předpokladu, že když budu mít následující dvě proměnné:
Kód: [Vybrat]
a = "string"
b = 42
test(x) {
  print("typ: {x.type}")
}
test(a) // typ: string
test(b) // typ: number

Tak se budou chovat stejně bez ohledu na to zda je jazyk silně nebo slabě typovaný. (Ignorujme prehistorii v podobě jazyka C.)
« Poslední změna: 24. 01. 2022, 02:29:19 od BoneFlute »

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #28 kdy: 24. 01. 2022, 02:54:02 »
K čemu by byly dobré, u nějakého dynamicky typovaného jazyka, závislostní typy? Jaký by měli přínos?
Přínosem je, že když překladač (AOT nebo JIT) zná typy, generuje mnohem efektivnější kód. Když mám třeba funkci readVect vracející instanci n ** Vect n Integer (tj. tzv. zobecněný součtový typ), můžu v dynamickém jazyce pomocí typové anotace zajistit, že příslušná funkce vrací jen objekty tohoto typu (třeba v Julii je ten zápis Vect{N,Int64} where N).

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovaném jazyce?
« Odpověď #29 kdy: 24. 01. 2022, 02:59:55 »
Vycházím z, možná nesprávného předpokladu, že když budu mít následující dvě proměnné:
Kód: [Vybrat]
a = "string"
b = 42
test(x) {
  print("typ: {x.type}")
}
test(a) // typ: string
test(b) // typ: number

Tak se budou chovat stejně bez ohledu na to zda je jazyk silně nebo slabě typovaný.
Jenže typeof je jen v silných typových systémech. To je právě ten problém. Ale to jsme dost odbočili, jen jsem chtěl říct, že dynamičnost a síla typového systému jsou dvě různé dimenze, které slouží dvěma nezávislým cílům, zajistit typovou bezpečnost a efektivní překlad či interpretaci. Pokud je jazyk staticky nebo silně typovaný, je obojího dosaženo, i když splňuje jen jednu z těch podmínek.