Nápad na bakalářskou práci se Spring

Re:Nápad na bakalářskou práci se Spring
« Odpověď #60 kdy: 13. 08. 2019, 22:02:01 »
Čili data, která přijdou na server bych neměl na vstupu nijak kontrolovat/odescapovávat a normálně je rovnou uložit do databáze? Čili na serveru nemusím dělat žádnou kontrolu vůči XSS útokům? Nebo to mám zkontrolovat (udělat escapování) těsně před tím, než pošlu data na view? Nebo poslat ta data přímo z DBa udělat escapování a kontrolu těch dat až na view při renderování dat?
Na vstupu byste data měl kontrolovat – tj. pustit dál jenom taková data, která mají smysl, platné hodnoty. Třeba pokud někde má být věk v letech, musí to být nezáporné celé číslo, a je rozumné alespoň s varováním kontrolovat i nějakou horní hranici. Ale ne escapovat – pokud uživatel zadává např. obyčejný text, je posloupnost <script> legální posloupností (co když uživatel třeba bude posílat část svého kódu). Escapovat je nutné na výstupu – aby se zobrazilo zase <script>, co zadal uživatel, a ne aby se místo toho vložil do HTML skutečný skript.

Escapování by se mělo ideálně dělat až ve view při renderování dat. Rozumné knihovny pro view jsou dokonce navržené tak, že ve výchozím nastavení samy escapují a pokud escapovat nechcete, protože máte příslušná data ošetřená jinak, musíte to speciálně zadat. Pokud takovou funkci knihovna pro view nemá, musel byste escapovat před tím, než data pošlete do view. Ale tomu bych se snažil vyhnout, protože na to určitě někde zapomenete.


Re:Nápad na bakalářskou práci se Spring
« Odpověď #61 kdy: 29. 08. 2019, 11:02:33 »
Zdravím,
poradil byste mi, prosím, jakým způsobem hodit tu aplikaci na net?

S tím, že mám Spring boot server s REST a frot end mám v jQuery. Potřebuji nějaký způsob, aby to bylo možné distrubovat tak, aby to na univerzitě mohli reálně vyzkoušet.
A asi by bylo třeba, aby spring běžel na nějakém PC, protože ta aplikace částečně zpravuje dokumenty (ukládá atd), takže bych potřeboval, aby tohle bylo splněno.

Poté potřebuji udat přesnou adresu na front-end do emailu.

1.) Jak byste mi doporučil takovouhle aplikaci distribuovat? Je to jako Bc pro univerzitu, takže potřebuji, aby k tomu měli přístup ve škole. 

2.) Já bych spíše asi potřeboval, aby mi to všechno běželo v rámci Wi-Fi. Napadlo by Vás, jak to vyřešit?

3.) Pokud by to všechno mělo běžet na localhostu (taky je to varianta, vzhledem k tomu, že je to k bc). Je zde způsob, jak nějak předělat tu cestu C:/file/cesta k index.html na nějaké url? Jako https://localhost:cesta?


Mockrát Vám děkuji
« Poslední změna: 29. 08. 2019, 11:08:30 od Arthnon »

Re:Nápad na bakalářskou práci se Spring
« Odpověď #62 kdy: 30. 08. 2019, 17:37:22 »
Aplikaci napsanou v Javě nepůjde umístit na webhostingy, které jsou zdarma, ty obvykle podporují jen PHP a statické soubory. Pokud má být ta aplikace dostupná jinde, než na jednom předváděcím počítači, je asi nejjednodušším řešením nainstalovat ji na nějaký VPS. Můžete zkusit spolek vpsFree, jestli by vám neposkytli nějaký testovací na omezenou dobu zdarma.

Frontendová aplikace by měla i lokálně také běžet z webového serveru. Buď ji můžete přibalit k tomu RESTovému serveru, nebo se dá lokálně spustit Jetty server a servírovat to z něj (Spring Boot interně také spouští buď Jetty nebo Tomcat), případně se používají vývojové servery postavené nad Node.js (zejména pokud byste měl s frontendem další plány a chtěl tam používat další knihovny a frontendové nástroje).

Re:Nápad na bakalářskou práci se Spring
« Odpověď #63 kdy: 06. 09. 2019, 12:45:12 »
Dobrý den,
chtěl bych se ujistit, zda chápu správně tuto anotaci @Transactional.
Pokud umístím tuto anotaci nad třídu, tak to znamená, že všechny metody uvnitř této třídy poběží jako transakce?

Čili pokud mám metodu, která provádí nějakou činnost v závislosti na stavu dokumentu v databázi a přijde zavolání nějaké metody několikrát za sebou, tak ta volání se budou volat po jednom, než ta první (nebo ta více ve předu) transakce ukončí svojí činnost? Chápu to tak správně?

Díky

Re:Nápad na bakalářskou práci se Spring
« Odpověď #64 kdy: 06. 09. 2019, 13:44:15 »
Anotace @Transactional na třídě má identický význam, jako kdybyste oanotoval @Transactional každou metodu v dané třídě.

Ta anotace znamená, že se metoda účastní „databázové“ transakce. Předpokládám, že používáte jenom jednu databázi – pak se to chová, jako kdybyste na začátku metody zavolal BEGIN TRANSACTION a na konci COMMIT nebo ROLLBACK (podle toho, zda byla vyhozena výjimka nebo ne).

Jak se budou chovat souběžné transakce určuje parametr isolation. Výchozí hodnota záleží na databázi, ale nebývá to SERIALIZABLE. Ten váš popis – spouštění po sobě – odpovídá právě izolaci SERIALIZABLE, která znamená, že se transakce musí chovat, jako by byly spuštěny jedna po druhé. Např. v PostgreSQL je výchozí  izolace transakcí Read Committed .

Ještě jednou upozorňuju, že se to týká databázových transakcí, není to synchronizace kódu v Javě – třeba pokud by databáze musela kvůli jiné transakci čekat s commitem, proběhne celá vaše metoda až do konce a čekat se bude až ve volání commitu, které Spring „přilepí“ (buď pomocí proxy bean nebo úpravou bajtkódu) až za kód vaší metody.


Re:Nápad na bakalářskou práci se Spring
« Odpověď #65 kdy: 06. 09. 2019, 13:50:29 »
hm, tak ted jsem z toho celkem zmatený.

Měl bych řešit nějakou synchronizaci java kodu tedy? Používám MySQL.
Celá tato metoda je v třídě označenou @Service a @Transactional.

Kód: [Vybrat]
public void updateSharing(long userId, long documentId, int approval) {
        Optional<Document> optionalDocument = documentRepository.findById(documentId);
        User user = userService.findUserById(userId);

        if(optionalDocument.isPresent()){
            Document document = optionalDocument.get();

            if(document.getDocumentState().getId() == 2){
                documentRepository.updateSharing(userId, documentId, approval);

                if(approval == 0){
                    List<User> users = userService.getUsersForApprovingDocument(documentId);
                    Map<String, String> map = emailService.createMessage(2, user, document);

                    if(document.getUser().isActive()){
                        users.add(document.getUser());
                    }

                    setDocumentType(documentId, 3);

                    sendEmail(users, map.get("subject"), map.get("message"));

                } else if(isDocumentApproved(documentId)){
                    setDocumentType(documentId, 1);

                    List<User> users = userService.getUsersForApprovingDocument(documentId);
                    if(document.getUser().isActive()){
                        users.add(document.getUser());
                    }

                    Map<String, String> map = emailService.createMessage(5, user, document);
                    sendEmail(users, map.get("subject"), map.get("message"));
                }
            } else if(document.getDocumentState().getId() == 1){
                documentRepository.updateSharing(userId, documentId, approval);
            } else {
                return;
            }
        }
    }

Re:Nápad na bakalářskou práci se Spring
« Odpověď #66 kdy: 06. 09. 2019, 19:13:12 »
Synchronizaci na úrovni Javy bych nedělal – kdybyste synchronizoval celou metodu, budou na sebe volání čekat, i když budete upravovat různé dokumenty. Ale hlavně by konkurenční přístup neměl být závislý na tom, že do databáze zapisuje jediná aplikace. Když bude aplikace víc využívaná, nebude aplikační server stíhat a budete ho chtít spustit ve více instancích na různých serverech – a rázem by vám veškerá řešení konkurenčního přístupu v aplikaci přestala fungovat. (Je mi jasné, že to asi nebude případ vaší aplikace, ale nedává smysl učit se to dělat špatně.)

Tohle se řeší pomocí zamykání na úrovni databáze. Buď pomocí pesimistický zámků, kdy ty záznamy opravdu zamknete (pomocí SELECT … FOR UPDATE) a ostatní transakce budou čekat na jejich uvolnění. U takovýchhle aplikací je ale daleko lepší použít optimistické zamykání – předpokládá se, že většinou ke konfliktu nedojde, takže se nezamyká, ale při zápisu se kontroluje, zda mezi tím nedošlo ke změně. A řeší se to teprve ve výjimečném případě, kdy ke změně došlo.

Optimistické zamykání se dělá tak, že u databázového záznamu máte uložené i označení jeho verze. Může to být čítač, který se s každým zápisem zvýší o jedničku, může to být třeba časové razítko poslední změny záznamu. Když načítáte data, načtete i to číslo verze, a když pak záznam aktualizujete, přidáte do WHERE podmínky tu verzi. Pokud by jiná transakce záznam mezi tím změnila, porovnání čísla verze nebude sedět a UPDATE proběhne „na prázdno“ – nezaktualizuje se žádný záznam. Podle toho poznáte, že v databázi jsou novější data a musíte požadovanou operaci provést znovu nad těmi novějšími daty. Má to tu výhodu, že to číslo verze můžete protáhnout až k uživateli do webové aplikace. Uživatel tak může mít záznam rozeditovaný klidně několik hodin, ten záznam není na serveru zamčený, takže neblokuje ostatní – a až se po několika hodinách rozhodne, že data uloží, jenom se podle čísla verze zkontroluje, že se mezi tím v databázi nic nezměnilo. Pokud se něco změnilo, nebudou čísla verzí souhlasit a musí se to vyřešit – buď uživateli načtete aktuální data z databáze a necháte ho jím provedené změny udělat znovu, nebo mu můžete zobrazit aktuální verzi a jeho změny, a nechat ho ty jeho změny zapracovat do té aktuální verze na serveru.

Re:Nápad na bakalářskou práci se Spring
« Odpověď #67 kdy: 10. 09. 2019, 12:40:36 »
Zdravím,
poradil byste mi prosím s následující věcí?
Momentálně mám funkcionalitu, že uživatel s oprávněním může vložit dokument do systému a nasdílet ho ke schválení například. Potřeboval bych ho ale ještě nějakým způsobem zašifrovat.
Jakým způsobem by to bylo nejlepší?

1.) Na front-endu ten, co vytváří dokument zadá dvě hesla - pro něj a pro ostatní uživatele. To se poté odešle na back-end, kde se to nastaví s danými oprávněními k dokumentu a s AES šifrováním. Nicméně jak bezpečně rozeslat hesla těm uživatelům? Přes email například? A kam bych někam ukládat to heslo pro uživatele? Do databáze? Případně v jakém formatu?

2.) Nastavit nějaký klíče na serveru a mít to jenom zašifrovaný na serveru a když to budu posílat na front-end, tak to dešifruju a přes https by to mělo být bezpečné.

Nějaký další možný způsob, jak tohle vyřešit?

Děkuji mnohokrát
« Poslední změna: 10. 09. 2019, 12:45:18 od Arthnon »

Re:Nápad na bakalářskou práci se Spring
« Odpověď #68 kdy: 10. 09. 2019, 12:50:52 »
Nicméně mě napadá, že by bylo potřeba někam uložit heslo i toho, co to vytváří, aby k tomu měl i někdo jiný stejný přístup... nebo nastavit globální hlavní heslo, které bude přístupné jenom na serveru a nechat uživatele, co vytváří dokument nastavit pouze heslo pro normální uživatele...

Re:Nápad na bakalářskou práci se Spring
« Odpověď #69 kdy: 10. 09. 2019, 13:14:00 »
A nebo ještě generovat heslo na straně serveru pro uživatele. Takže by ten, co vytváří ten dokument vůbec nezadával ta hesla, ale ta hesla by se vygenerovala na serveru a poslala emailem. Ale pořád by stejně zůstala otázka, zda je email bezpečný a jak ta hesla stejně potom uložit...

Re:Nápad na bakalářskou práci se Spring
« Odpověď #70 kdy: 10. 09. 2019, 13:17:28 »
Hesla bych k tomu vůbec nepoužíval – aby to bylo bezpečné, musela by být dostatečně složitá, a pak je problém, jak si je bude uživatel ukládat… Lepší je použít asymetrickou kryptografii, veřejné a soukromé klíče. Uživatel má svůj privátní klíč, dokumenty pro něj zašifrujete veřejným klíčem. Tím pádem nemusíte řešit distribuci hesel, pouze máte na serveru pro každého uživatele jeho veřejný klíč.

Ale udělat to opravdu bezpečně je složitější, než celý zbytek aplikace. Je otázka, zda má smysl se do toho pouštět a komplikovat si tím aplikaci, když to stejně nejspíš nebudete mít udělané dostatečně bezpečně. Třeba e-maily se dnes v drtivé většině případů posílají nešifrované, a skoro nikoho to netrápí…

Re:Nápad na bakalářskou práci se Spring
« Odpověď #71 kdy: 10. 09. 2019, 13:30:15 »
Hesla bych k tomu vůbec nepoužíval – aby to bylo bezpečné, musela by být dostatečně složitá, a pak je problém, jak si je bude uživatel ukládat… Lepší je použít asymetrickou kryptografii, veřejné a soukromé klíče. Uživatel má svůj privátní klíč, dokumenty pro něj zašifrujete veřejným klíčem. Tím pádem nemusíte řešit distribuci hesel, pouze máte na serveru pro každého uživatele jeho veřejný klíč.

Ale udělat to opravdu bezpečně je složitější, než celý zbytek aplikace. Je otázka, zda má smysl se do toho pouštět a komplikovat si tím aplikaci, když to stejně nejspíš nebudete mít udělané dostatečně bezpečně. Třeba e-maily se dnes v drtivé většině případů posílají nešifrované, a skoro nikoho to netrápí…

A jak tohodle docílím? Já mám na serveru certifikát na https a potom jeden soubor .jks na na podepsání JWT. Jak udělám to, co Vy popisujete? V té mojí aplikaci nemám, že by uživatelé používali klíče. To jim musím vytvořit keypair, když se registrují? Nebo jak by se to udělalo?

Re:Nápad na bakalářskou práci se Spring
« Odpověď #72 kdy: 10. 09. 2019, 13:56:14 »
ok, co jsem tak pochopil, tak budu potřebovat vzájemný SSL handshake.

Jak ale použiju certifikát na straně klienta, když bude přistupovat k aplikaci?

Re:Nápad na bakalářskou práci se Spring
« Odpověď #73 kdy: 10. 09. 2019, 14:25:21 »
Myslel jsem, že chcete ty dokumenty šifrovat tak, aby se k nim pak dostal až uživatel – tj. musel by je dešifrovat uživatel nějakým svým nástrojem, např. PGP. Webové prohlížeče nemají podporu pro bezpečné šifrování, a pokud byste ten dokument chtěl dešifrovat na serveru, je zbytečné šifrovat to pro každého uživatele zvlášť. Pokud byste to chtěl mít zabezpečené tak, aby se k datům nedostal někdo, kdo by třeba ukradl serverový disk, stačí to šifrovat globálně jedním klíčem. Některé databáze mají možnost šifrovat data, případně pokud soubory ukládáte na disk, stačilo by asi použít šifrovaný souborový systém.

Záleží na tom, k čemu přesně to šifrování má sloužit, proti jakým vektorům útoku má bránit.

Re:Nápad na bakalářskou práci se Spring
« Odpověď #74 kdy: 30. 10. 2019, 10:50:57 »
Zdravím,
momentálně mám aplikaci rozvrženou tak, jak je zobrazeno na následujícím tomto obrázku https://imgur.com/a/YmAKlQq. Na IIS běží tedy JS a HTML/CSS a na jiném PC běží REST server ve Springu a DB.

1.) Může to takto být navrženo? Případně proč ano či ne? Jak by to mělo být správně navrženo?
2.) Bylo by lepší nechat běžet REST server na IIS také nebo ta varianta na obrázku je v pohodě? Jde to vůbec, aby Spring Boot mohl běžet na IIS?

Mockrát děkuji