Jak validovat DTO v dynamicky typovaném jazyce?

Jak validovat DTO v dynamicky typovaném jazyce?
« kdy: 23. 01. 2022, 09:47:22 »
Rekneme, ze treba v Javascriptu budu vyrabet endpoint:

POST localhost:8080/order
accept: Application/Json

A rekneme, ze kdyz uz pouzivam na danou vec Javascript a ne nejaky staticky typovany jazyk, abych si ulehcil praci, tak nepouziju Relacni Databazi ale treba MongoDB, abych si jeste vic ulehcil praci.

Takze mi webova stranka vyrobi JSON Order a posle mi ho do endpointu localhost:8080/order, kde ja ho nejak zvaliduju a potom tak jak je ulozim do MongoDB.

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?
« Poslední změna: 23. 01. 2022, 22:43:59 od Petr Krčmář »


alex6bbc

  • *****
  • 1 656
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #1 kdy: 23. 01. 2022, 10:02:17 »
tak napriklad mongodb ma maximalni velikost jednoho zaznamu 16 mb a klic je maximalne 1024 bajtu.
treba by sly nastavit i vlastni limity a pak by db vracela chybu pri prekroceni velikosti?

co pouzit nejakou knihovnu na validaci jsonu, napr. rychle jsem nasel https://github.com/ajv-validator/ajv ?!

Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #2 kdy: 23. 01. 2022, 10:06:38 »
tak napriklad mongodb ma maximalni velikost jednoho zaznamu 16 mb a klic je maximalne 1024 bajtu.
treba by sly nastavit i vlastni limity a pak by db vracela chybu pri prekroceni velikosti?

co pouzit nejakou knihovnu na validaci jsonu, napr. rychle jsem nasel https://github.com/ajv-validator/ajv ?!

Ty jsi nepochopil muj dotaz. Proc bych mel pouzivat validaci jsonu pomoci napr onoho ajv-validator, ktery me nuti definovat json schema, kdyz si muzu preddefinovat DTO v staticky typovanem jazyce a k nemu tabulky v relacni databazi.

L..

  • ****
  • 310
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #3 kdy: 23. 01. 2022, 10:10:15 »
1) Použitím dynamicky typovaného jazyka si (u netriviálních projektů) práci neušetříte, ale naopak přiděláte. Úplně ze začátku budete o něco rychlejší, ale to se rychle změní, protože budete pálit čas hledáním chyb, které za vás mohla odchytit typová kontrola. V pozdějších fázích pak budete zoufale zdlouhavě dohledávat, jaká je vlastně struktura toho či kterého objektu, protože ušetříte i na psaní dokumentace, jak je dnes "moderní" (*). Znám několik projektů, kde autoři "ušetřili" tím, že je napsali v Javascriptu a pak je horečně a za velkých nákladů přepisovali do Typescriptu.

2) Volba SQL / NoSQL taky není o ušetření, ale spíš o tom, zda vám na data pasuje relační model či nikoli.

3) Zrovna 10GB nesmyslů ošetříte omezením na web serveru, že tak dlouhý request prostě odmítne. Ale ano, server musí validovat vstupy. SQL vám nějaké validace základní udělá, ale ty jsou opravdu základní, takže tam nějaká custom validace musí být tak jako tak skoro vždy, zvlášť, pokud ještě mají být chybové hlášky nějak rozumně komunikovatelné uživateli. Můžete na komunikaci použít GraphQL, které vám udělá kontrolu zhruba na úrovní jako SQL, akorát umí dobře pracovat i s vnořenými objekty. Pro lepší validaci v Javascriptu doporučuji třeba yup.

*) Já jsem ze staré školy, mě ještě učili, že nejpoužívanějším příkazem dobrého programátora je REM.

alex6bbc

  • *****
  • 1 656
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #4 kdy: 23. 01. 2022, 10:12:58 »
tak napriklad mongodb ma maximalni velikost jednoho zaznamu 16 mb a klic je maximalne 1024 bajtu.
treba by sly nastavit i vlastni limity a pak by db vracela chybu pri prekroceni velikosti?

co pouzit nejakou knihovnu na validaci jsonu, napr. rychle jsem nasel https://github.com/ajv-validator/ajv ?!

Ty jsi nepochopil muj dotaz. Proc bych mel pouzivat validaci jsonu pomoci napr onoho ajv-validator, ktery me nuti definovat json schema, kdyz si muzu preddefinovat DTO v staticky typovanem jazyce a k nemu tabulky v relacni databazi.

z moji odpovedi plyne, ze to stejne musite zvalidovat sam :-)


Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #5 kdy: 23. 01. 2022, 10:21:20 »
Podle me nemate predstavu o cem pisete, validace v case behu se statickym/dynamicky typovanim nijak nesouvisi.

to co chcete resi treba mongoose, nepotrebujete DTO vrsvu navic, staci "fat model"
« Poslední změna: 23. 01. 2022, 10:25:02 od A.P.Hacker »

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #6 kdy: 23. 01. 2022, 11:23:42 »
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.
Ano, přesně takto to je. Dynamicky typovaný jazyk je vhodný tak akorát pro nějaké menší prototypy, jinak je osinou víme kde. A k té databázi, IMHO není důvod nepoužít relační, pokud se nenarazí na nějaké limity (zpracování gigabajtů příchozích dat v reálném čase apod.).

Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #7 kdy: 23. 01. 2022, 11:44:04 »
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.
Ano, přesně takto to je. Dynamicky typovaný jazyk je vhodný tak akorát pro nějaké menší prototypy, jinak je osinou víme kde. A k té databázi, IMHO není důvod nepoužít relační, pokud se nenarazí na nějaké limity (zpracování gigabajtů příchozích dat v reálném čase apod.).

dokumentova databaze ma smysl, pokud chcete ukladat data tak jak prichazi, napriklad z nejakeho API, nasledne je analyzovat. Casto API odpovedi stejne nekam logujete.

kazda technologie ma nejaky idealny usecase. Jednoznacne odsudky nemam rad.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #8 kdy: 23. 01. 2022, 12:01:05 »
dokumentova databaze ma smysl, pokud chcete ukladat data tak jak prichazi, napriklad z nejakeho API, nasledne je analyzovat.
V otázce je explicitně “order”, takže je celkem jasné, o jaký typ dat se jedná.

Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #9 kdy: 23. 01. 2022, 12:08:06 »
tak napriklad mongodb ma maximalni velikost jednoho zaznamu 16 mb a klic je maximalne 1024 bajtu.
treba by sly nastavit i vlastni limity a pak by db vracela chybu pri prekroceni velikosti?

co pouzit nejakou knihovnu na validaci jsonu, napr. rychle jsem nasel https://github.com/ajv-validator/ajv ?!

Ty jsi nepochopil muj dotaz. Proc bych mel pouzivat validaci jsonu pomoci napr onoho ajv-validator, ktery me nuti definovat json schema, kdyz si muzu preddefinovat DTO v staticky typovanem jazyce a k nemu tabulky v relacni databazi.

Tak jako tak definujes ty validace... neni to jedno?
Ted sem treba videl java projekt kde se pouziva json schema a z neho se genruji ty dto...
Vyhoda je v tom, ze schema muzu sdilet mezi vice projekty v ruznych jazycich kdezto java DTOcka me uzamknou v jave...

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #10 kdy: 23. 01. 2022, 12:30:48 »
Ted sem treba videl java projekt kde se pouziva json schema a z neho se genruji ty dto...
Vyhoda je v tom, ze schema muzu sdilet mezi vice projekty v ruznych jazycich
To zní jako Protobuf.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #11 kdy: 23. 01. 2022, 12:40:37 »
Opravte me jestli se mylim, ale ja budu muset zvalidovat pritomnost a delku kazdeho jednoho fieldu
BTW tu přítomnost a nekonzistence může řešit deserializace (bez ohledu na charakter typového systému). Typicky se dělá validace před odesláním, po přijetí požadavku a případně ještě v databázi (tam by ale už vše mělo být košer), otázka spíš je, jak si tu validaci to nejvíc ulehčit (právě pomocí nějakého schématu nebo anotací v kódu).

Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #12 kdy: 23. 01. 2022, 13:58:14 »
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.

Idris

  • *****
  • 2 286
    • Zobrazit profil
    • E-mail
Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #13 kdy: 23. 01. 2022, 14:06:41 »
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.

Re:Jak validovat DTO v dynamicky typovanem jazyce?
« Odpověď #14 kdy: 23. 01. 2022, 14:07:55 »
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.

csrf token a accept hlavicky
« Poslední změna: 23. 01. 2022, 14:11:42 od A.P.Hacker »