Diskuze: Zabezpečení C# aplikace proti .NET Reflector
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 25 zpráv z 25.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
A jaktože máš v aplikaci přihlašovací údaje k databázi?
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.
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.
Mohl bys mi poslat nějakou ukázku, nebo něco ?
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.
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.
sak muzes v db udelat ucet co ma jen prava na cteni + pravo na spusteni databazove procedury Registrace
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 ?
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.
To je naprostá mystifikace, co píšeš.
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.
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.
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
ConfigurationManager.ConnectionStrings["MyKey"].ConnectionString. 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/nezmodifikuje nic na co nema prava.
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.
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.
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.
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.
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ší.
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ěď ?
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/cokoliv 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.
A mohl bys mi prosimte poslat nejakou ukazku toho api.php ?
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)
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.
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š.
Zobrazeno 25 zpráv z 25.