Bezpieczne ZDALNE połączenie z MySql - C#

0

Witam. Wahałem się w którym dziale umieścić ten temat, ale wypadło na ten.

Otóż udało mi się połączyć z bazą danych stworzoną na hostinger.pl. Jednak w kodzie C# musiałem podać wszystkie dane, a jak wiadomo kod można zdekompilować. Dla aplikacji służącej tylko mi oraz zaufanym osobom wydaje się to wystarczające, ale aplikacja z czasem trafi do osób trzecich.

Szukałem dalej.
Tak oto stworzyłem stronę internetową, a tam wpakowałem pliki PHP, które bezpośrednio już łączyły się z bazą. Jeden służył do wrzucania danych do bazy(dostarczone przez kod C#), a drugi do pobierania ich(i pakowanie do kodu C#).
W kodzie C# jedyne co widać to link do skryptu PHP.
Aby uniemożliwić wpisywanie danych bezpośrednio z przeglądarki dodałem stałą w postaci ciągu znaków. Ten ciąg powinien zgadzać się z ciągiem w skrypcie jednak... Po dekompilacji znowu jestem bezbronny i oszuści mogą wrzucać wartości jakie chcą.

Tak więc teraz pozostaje pytanie.
W jaki sposób połączyć aplikację C# z bazą MySQL tak, aby móc wrzucać oraz pobierać dane z tejże bazy oraz kod był możliwy do wykonania tylko z poziomu aplikacji. I oczywiście tak, by po dekompilacji nie było możliwości znalezienia danych dostępu do bazy.

3

Odpowiedź jest prosta: nie da się. Choćbyś nie wiem co kombinował, koniec końców wszystko sprowadza się do wysłania pewnego ciągu bajtów, które można podsłuchać (patrz: Wireshark).

Nie oznacza to oczywiście, iż należy pozostać bezradnym - aby zminimalizować ryzyko włamania, powinieneś utworzyć do swojej bazy backend (API), które będzie opakowywać każdą możliwą do wykonania akcję. Użytkownicy będą mogli przechwycić sposób komunikacji program-API, lecz nie będą mogli zrobić nic więcej ponad to, co sam w tym API udostępnisz (w przeciwieństwie do przejęcia danych logowania do bazy danych, z którymi to potem taki hakier może robić co sobie zechce).

0

Dzięki za szybką i treściwą odpowiedź.
W międzyczasie patrzyłem na wrzucenie stringów z danymi do .config (sam Microsoft to proponował). Jednak nie mam pewności co do wrzucania tych danych do projektu.
Po wstępnych przeszukaniach znalazłem coś takiego jak ASP.NET. Nazwa często się przewijała lecz zawsze jakoś ją ignorowałem. Chyba najwyższy czas wziąć ją pod lupę.

0
Patryk27 napisał(a):

Odpowiedź jest prosta: nie da się. Choćbyś nie wiem co kombinował, koniec końców wszystko sprowadza się do wysłania pewnego ciągu bajtów, które można podsłuchać (patrz: Wireshark).

Nie oznacza to oczywiście, iż należy pozostać bezradnym - aby zminimalizować ryzyko włamania, powinieneś utworzyć do swojej bazy backend (API), które będzie opakowywać każdą możliwą do wykonania akcję. Użytkownicy będą mogli przechwycić sposób komunikacji program-API, lecz nie będą mogli zrobić nic więcej ponad to, co sam w tym API udostępnisz (w przeciwieństwie do przejęcia danych logowania do bazy danych, z którymi to potem taki hakier może robić co sobie zechce).

Nie masz racji i do tego wprowadzasz w błąd ludzi. Opcji jest bardzo dużo. Możesz zestawić VPN pomiędzy klientem a serwerem, tunelować połączenie albo użyć wbudowanego w MySQL połączenia za pomocą SSL. Dokumentacja jest łatwa do znalezienia: https://dev.mysql.com/doc/refman/5.7/en/secure-connections.html

0

Co do zabezpieczenia aplikacji to tak jak kolega wcześniej wspomniał nie da się zabezpieczyć przed dekompilacją ale przecież nie ma takiej potrzeby. Rozwiązanie jest bardzo proste: musisz autentykować i autoryzować użytkowników - każdy otrzymuje swój login i swoje hasło (serwer już masz, który to obsłuży), które wpisują podczas pierwszego uruchomienia programu albo zawsze. Jeżeli ktoś złośliwy zdekompiluje aplikację to i tak nic nie zrobi bez loginu i hasła.

2

Tak, każdemu użytkownikowi twórz własne konta bazy danych i najlepiej jeszcze własne tabele, aby nie mogli przecież usuwać cudzych rekordów :D

Dlatego właśnie w tym celu tworzy się API i już. A dodatkowo jedną z najważniejszych zalet poprawnie zaprojektowanego API, oprócz bezpieczeństwa, jest prostota w skalowaniu.

0

Odpowiedź o API pewnie jest najlepsza. Ale dodatkowo możesz poczytać o czymś takim, co nazywa się obfuscator. Kod napisany w C# bardzo łatwo podejrzeć. Natomiast Obfuscator to takie narzędzie, który Ci ten kod brudzi. Ale robi to na poziomie kompilacji, więc dla Ciebie nie ma to żadnego znaczenia. Po takiej opreacji program działa chyba z taką samą prędkością, tylko jest dużo bardziej nieczytelny dla potencjalnego hackera. Być może też całkowicie zamaże Ci jawnego stringa. Musisz sobie o tym poczytać.

0

@neves: dzięki, coraz gorzej z moją znajomością języka polskiego :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1