Avatar
Jonáš Mrva
Člen
Avatar
Jonáš Mrva:

Ahojte všichni,
Je nějaká možnost, jak zabezpečit C# aplikace před použitím .NET Reflectoru ?
Není to kvůli zabezpečení proti crackům. Je to kvůli toho, aby někdo přes .NET Reflector nezjistil přihlašovací údaje k mojí databázi. Ta obsahuje prakticky všechen obsah mojí aplikace (uživatelské účty, seznam skupin + jejich hesla, atd..).
Předem děkuji za nějaké rady.

 
Odpovědět 3. dubna 15:10
Avatar
Filip Šohajek
Redaktor
Avatar
Odpovídá na Jonáš Mrva
Filip Šohajek:

A jaktože máš v aplikaci přihlašovací údaje k databázi?

 
Nahoru Odpovědět 3. dubna 15:24
Avatar
Jonáš Mrva
Člen
Avatar
Jonáš Mrva:

Protože je používám k ukládání nových článků, přihlašování, registraci, atd... Nebo bych to měl řešit jinak ? Jsem nakloněn všem radám.

 
Nahoru Odpovědět 3. dubna 15:27
Avatar
Filip Šohajek
Redaktor
Avatar
Odpovídá na Jonáš Mrva
Filip Šohajek:

Měl by jsi mít serverové API a přes něj tyto věci dělat. Ty by jsi se jen přihlašoval svým jménem a heslem.

 
Nahoru Odpovědět 3. dubna 15:32
Avatar
Jonáš Mrva
Člen
Avatar
Odpovídá na Filip Šohajek
Jonáš Mrva:

Mohl bys mi poslat nějakou ukázku, nebo něco ?

 
Nahoru Odpovědět 3. dubna 15:34
Avatar
Odpovídá na Jonáš Mrva
sadlomaslox25:

mas to spatne navrhnute. pokud mas heslo v kodu to znamena ze kdokoliv spusti tvoji aplikaci tak ma automaticky pristup ke vsem datum v databazi? pokud ano tak proc by nekdo pouzival reflector.

minimalne je dobre si heslo ulozit do appconfigu a ten zasifrovat pomoci dpapi http://stackoverflow.com/…-application

lepsi by bylo udelat v db uzivatele a definovat si view a databazove procedury pro vsechny operace na ktere ma uzivatel aplikace prava a zakazat primy pristup ke vsem tabulkuma.

jinak na 'obejiti' reflectoru se pouzivaji obfuscatory https://en.wikipedia.org/…ors_for_.NET ale ty jdou obejit. mnohem lepsi je pohrat si s architekturou aplikace.

 
Nahoru Odpovědět 3. dubna 15:37
Avatar
Jonáš Mrva
Člen
Avatar
Odpovídá na sadlomaslox25
Jonáš Mrva:

No. Já jsem nad tím vlastně doteď nějak moc neuvažoval. Mám to udělané tak, že při zapnutí aplikace se mi z DB stáhnou všechny skupiny, ve kterých ten uživatel je + všechny úkoly a celkově obsah těch skupin. Následně ta aplikace uzavře připojení se serverem. (Do doby dokud někdo nepřidá nějaký úkol)

A pokud se někdo registruje, tak to automaticky po kliknutí na registrovat přidá do DB řádek s jeho uživatelským jménem, hashcodem z hesla + pár dalších informací.

Uvažoval jsem, že bych to udělal tak, že bych v SQL vytvořil účet, který by mohl max SELECT, ale to by lidem nedovolilo registrovat se.

 
Nahoru Odpovědět 3. dubna 15:48
Avatar
Odpovídá na Jonáš Mrva
sadlomaslox25:

sak muzes v db udelat ucet co ma jen prava na cteni + pravo na spusteni databazove procedury Registrace

 
Nahoru Odpovědět 3. dubna 16:20
Avatar
Jonáš Mrva
Člen
Avatar
Jonáš Mrva:

No dobře, přidal jsem connection string do app.conf. Ale nějak jsem nepochopil jak mám zašifrovat tu sekci v App.conf. Mohl bys mi to nějak vysvětlit ? :D

 
Nahoru Odpovědět 3. dubna 16:22
Avatar
Odpovídá na Jonáš Mrva
sadlomaslox25:

no a co presne si tam nepochopil z toho examplu? po spusteni programu si ten kod nacte app.config a podiva se jestli je dana sekce chranena heslem. pokud neni tak se zasifruje a ulozi. sifruje se pomoci DPAPI tzn. ze data se zasifruji pres unikatni klic PC nebo uzivatele podle toho jak je nastaveny windows. desifrovani se provadi automaticky a neni treba pouzivat priklad z toho examplu.

teoreticky je mozne toto heslo rozsifrovat ale pouze na stejnem pocitaci nebo pod stejnym uzivatelem ktery to zasifroval. neni to nejak extra bezpecne ale lepsi nez plain text. dulezite je aby pri nasazeni aplikaci (napriklad pri kopirovani z flesky na klientsky pocitac) byl na flasce app.config s nezasifrovanyma datama a po prekopirovani na cilovy pocitac se aplikace hned pustila aspon jednou aby se aplikovalo sifrovani.

 
Nahoru Odpovědět 3. dubna 17:28
Avatar
coells
Redaktor
Avatar
Odpovídá na sadlomaslox25
coells:

To je naprostá mystifikace, co píšeš.

  1. přístupové údaje se ukládají do configu kvůli snadnějšímu přístupu a změně na různých prostředích, ne složitějšímu
  2. config se "sám" nešifruje, to musíš udělat ručně a aplikační část configu nejde šifrovat bez oprávnění admina [při běžné instalaci]
  3. šifrování configu neslouží k ochraně údajů na prostředí, ale mimo prostředí, to se týká hlavně záloh a externích služeb
  4. dešifrování se provádí stejně jako šifrování - jedním příkazem z command-line
  5. z hlediska dotazu je šifrování configu přes DPAPI naprosto neúčinné

Jonáš Mrva

Filip naznačil řešení. Pokud je databáze na stejném fyzickém stroji jako aplikace, žádné zabezpečení neexistuje. V opačném případě se databáze nikdy nevystavuje ven, ale máš připravenou službu (například na IIS), která zajišťuje bezpečný přístup k informacím. Globální údaje (nespecifické per uživatel) v aplikaci, kam má uživatel fyzický přístup, se nedají nijak ochránit. Ochránit můžeš pouze údaje jednotlivých uživatelů mezi sebou.

 
Nahoru Odpovědět  +1 3. dubna 17:55
Avatar
Jonáš Mrva
Člen
Avatar
Odpovídá na sadlomaslox25
Jonáš Mrva:

No dobře, ale to je problém že. Protože pokud někomu pošlu tu aplikaci s originálním app.conf, tak předtím než si to on prvně spustí se do toho configu může podívat a ten string uvidí. :/
A pokud mu pošlu aplikaci s již zašifrovaným configem, tak nebude schopný ji spustit, protože ta aplikace ten config nerozšifruje.

 
Nahoru Odpovědět 3. dubna 18:01
Avatar
Odpovídá na coells
sadlomaslox25:

a. to sice ano ale citlive udaje tak jako connection stringy je mozne sifrovat a je pro to prima podpora.
b. nepsal jsem ze config se sam sifruje. postoval jsem ukazku jak lze connection string zasifrovat. desifrovani se pak provede v ramci aplikace samo pokud ke connection stringu pristoupis pres Configuration­Manager.Connec­tionStrings["My­Key"].Connecti­onString. Co se tyka opravneni admina tak uprimne netusim jestli to pujde i pod obyc uzivatelem, ale pocitam ze rozsifrovani by melo fungovat i pod obyc uzivatelem.
c. Cituji MS:
Part of securing an application involves ensuring that highly sensitive information is not stored in a readable or easily decodable format. Examples of sensitive information include user names, passwords, connection strings, and encryption keys. Storing sensitive information in a non-readable format improves the security of your application by making it difficult for an attacker to gain access to the sensitive information, even if an attacker gains access to the file, database, or other storage location.
e. puvodni myslenka celeho topicu byla jestli jde heslo obfuscatnout. sifrovani je mnohem lepsi z meho pohledu nez obfuscator.

ja jsem jasne rikal ze je lepsi je to poresit v ramci architektury aplikace. webservise jsem nezminoval protoze byly uz zminene vyse a taky vzhledem k povaze diskuze mne to prislo jako overkill. staci si vytvorit view a stored procedury a nikdo ti z db nevytahne/nez­modifikuje nic na co nema prava.

 
Nahoru Odpovědět 3. dubna 18:12
Avatar
Odpovídá na Jonáš Mrva
sadlomaslox25:

no tak proc do appconfigu nedas nedas uzivatele ktery ma pravo volat jedinou stored proceduru a tou je registrace. po te co se zaregistruje tak bys zmenit uzivatele v tom connection stringu na toho nove zalozeneho, ktery uz ma nejake vyssi prava.

 
Nahoru Odpovědět 3. dubna 18:15
Avatar
Jonáš Mrva
Člen
Avatar
Odpovídá na sadlomaslox25
Jonáš Mrva:

To zní dobře. Podívám se na to až budu mít čas.

 
Nahoru Odpovědět 3. dubna 18:30
Avatar
coells
Redaktor
Avatar
Odpovídá na sadlomaslox25
coells:

Zase jenom mystifikace.

Šifrování configů jsme používali hodně let, takže ti můžu zaručit, že se používá z jiných důvodů, než si myslíš. Tuhle část infrastruktury jsem dokonce navrhoval. Ten výtažek, co jsi poslal, podporuje to, co tvrdím, ty to jen špatně chápeš. "improving security" neznamená "is secure", význam se vztahuje na externí přístup, o kterém jsem mluvil. Každý, kdo dělal v Microsoftu, musí mít bezpečnostní školení o podobných věcech, aby měl přehled a uměl je správně použít. Mám školení i mnohaleté zkušenosti, takže sice mluvíš zasvěceně, ale jsou to jen nesmysly.

Kdykoliv publikuješ přístup k databázi, není to bezpečné, to ti řekne každý securiťák. Databáze není dělaná na bezpečnost, ale na práci s daty. To je jen další nesmysl.

 
Nahoru Odpovědět 3. dubna 19:51
Avatar
Jonáš Mrva
Člen
Avatar
Odpovídá na coells
Jonáš Mrva:

Ty vypadáš, že tomu rozumíš. Tak mi (jako totálně nezasvěcenému) prosím pošli nějaký tutorial/vysvětlení řešení, které pochopím a budu ho schopen provést.

 
Nahoru Odpovědět 3. dubna 20:25
Avatar
Odpovídá na coells
sadlomaslox25:

Mystifikace?

kdyz je v oficialni dokumentaci https://msdn.microsoft.com/…3tyfkaw.aspx napsane:

Storing sensitive information in a non-readable format improves the security of your application by making it difficult for an attacker to gain access to the sensitive information,

To help secure information in configuration files, ASP.NET provides a feature called protected configuration, which enables you to encrypt sensitive information in a configuration file.

tak tady rozhodne nikoho nemystifikuju. ty vety sem vylozil tak jak jsou napsane. neni tam zadny dvojsmysl. nikde nerikam ze je to neprolomitelny nebo extra tezko prolomitelny zpusob ochrany.

Mam sice jen MCPD a MCSD ale nepisu kazdemu kdo dela aplikaci o dvou uzivatelich musi mit 3-tier architekturu s MVC jinak je to uplne naho.

 
Nahoru Odpovědět 3. dubna 20:33
Avatar
coells
Redaktor
Avatar
Odpovídá na Jonáš Mrva
coells:

Základní pravidlo je, že pokud má uživatel fyzický přístup k tvé aplikaci, nezabráníš úniku dat. Takže jediný způsob, jak přístup do databáze ochránit, je služba, která se stará o tuhle část. Databáze nemůže být přístupná zvenku, ta je na to hodně citlivá. Ale to už jsem ti psal. Jestli hodláš ukládat něco cenného nebo citlivého, odpověď je, že na lokále to nejde.

Když mě to dřív zajímalo, mrknul jsem se, jak funguje nějaká aplikace, je to snadnější, než to vypadá a i obfuskace se dá obejít bez větších problémů. O to horší to je, že problémem není obyčejný uživatel, ale stačí jen jediný šikovnější, abys o všechno přišel.

Neznám žádný tutoriál a určitě bych ti nedoporučoval psát takovou aplikaci podle tutoriálu, knížky jsou lepší.

 
Nahoru Odpovědět 3. dubna 21:07
Avatar
Jonáš Mrva
Člen
Avatar
Odpovídá na coells
Jonáš Mrva:

Dobře a co kdybych si vytvořil někde PHP stránku, které bych z C# posílal otázky na DB a ta PHP stránka by se potom ptala DB.
Bude toto bezpečné ?

Pokud jo, jak můžu z WPF poslat otázku na PHP a dostat z něho odpověď ?

 
Nahoru Odpovědět 4. dubna 15:17
Avatar
coells
Redaktor
Avatar
Odpovídá na Jonáš Mrva
coells:

Takhle se to v podstatě dělá.
Ale místo "stránky" se dělá webová služba nebo REST API nad PHP/.NET/Java/co­koliv a to pak voláš pomocí WCF.
Cestička přes webové služby (v .NET je to WCF, Windows Communication Foundation) je prošlapaná a Visual Studio skoro všechno udělá za tebe, o to jednodušší to je, když je .NET na obou stranách.

Editováno 4. dubna 17:37
 
Nahoru Odpovědět  +1 4. dubna 17:36
Avatar
Jonáš Mrva
Člen
Avatar
Odpovídá na coells
Jonáš Mrva:

A mohl bys mi prosimte poslat nejakou ukazku toho api.php ?

 
Nahoru Odpovědět 4. dubna 18:32
Avatar
Odpovídá na Jonáš Mrva
sadlomaslox25:

byt tebou bych sel radsi do WCF neni to moc slozite a na klientovi ti to vygeneruje potrebne tridy pro pouziti. nejeky starsi tutorial je tady http://blogs.microsoft.co.il/…studio-2008/ ale aktualne se toho moc nezmenilo (az na to ze se moc nepouzivaji datasety)

 
Nahoru Odpovědět 4. dubna 19:34
Avatar
Jonáš Mrva
Člen
Avatar
Jonáš Mrva:

Díky. Už jsem začal tvořit api a přepisovat aplikaci, tak aby s ním pracovala. Jenže jsem teď narazil. Jak mám v C# zvládnout akci "die("nějaký erorr;")" ?
Když dám požadavek na php do Try, tak se stejně bezproblémově vykoná. Ale já potřebuji, aby když se v php zavolá "die();" ukázala ta moje aplikace chybu.

 
Nahoru Odpovědět 6. dubna 20:18
Avatar
VitekST
Člen
Avatar
Odpovídá na Jonáš Mrva
VitekST:

Velmi jednoduché.

MessageBox.Show("Nastala chyba!");

Potřebuješ-li přerušit konání aktuální akce, kód si dej do nějaké metody, a pak můžeš z ní vyskočit takto:

return;

Pokud by metoda měla návratový typ, musíš vrátit nějaký objekt, tak ho tam jednoduše napíšeš.

Editováno 8. dubna 7:18
 
Nahoru Odpovědět 8. dubna 7:18
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 25 zpráv z 25.