Skocz do zawartości

[Delphi] Bezpieczne korespondowanie z bazą MySQL


Operator amator Delphi

Polecane posty

Witam.

 

Mam taki problem. Chcę aby mój program łączył się z bazą MySQL. Nie chce trzymać tego hasła w programie, ponieważ w ten sposób narażam się na łatwe przechwycenie go (np. dekompilacja). Chciałbym żeby mój program obsługiwał około 100 użytkowników. Każdy z nich pobierał by z tej bazy przez mój program jakieś rekordy, oraz dodawał je.

Macie jakiś pomysł? Szukałem na google jak zrobić to za pomocą wywoływania skryptu php, ale nie znalazłem żadnych przykładów które bym zrozumiał. Jeśli ktoś wie jak się takie rzeczy robi to proszę o wytłumaczenie jak wymieniać dane między aplikacją a skryptami umieszczonymi na serwerze.

Link do komentarza
Udostępnij na innych stronach

Najlepiej aby wszelkie operacje na bazie były wykonywane z poziomu skryptów na serwerze. Twój program korzystałby z funkcjonalności oferowanych przez te skrypty.

Też tak myślałem, żeby tak zrobić. Pytanie tylko jak korespondować z tymi skryptami? Na tą chwile jestem w stanie wrzucić na formę WebBrowsera który by wywoływał te skrypty jak zwykła przeglądarka, po czym bym kod HTML strony czytał, ale nie podoba mi się takie rozwiązanie. WebBrowser jest do du**. Można by to jakoś bardziej po ludzku skodzić?

 

Czy takie rozwiązanie jest odporne na sniffing? Co prawda, w moim programie zależy mi tylko na ukryciu hasła do bazy, ale na przyszłość chciałbym wiedzieć czy taki algorytm się nada.

Link do komentarza
Udostępnij na innych stronach

Najpierw sprawdź czy MySQL obsługuję połączenie ssl jeśli tak to nie ma problemu, a w programie i tak musisz trzymać zakodowane hasło.

Jeśli jednak chcesz zrobić warstwe logiczną osobno to najlepszym rozwiązaniem to zdalne wywoływanie funkcji: CORBA, SOAP(php chyba to obsługuję) itp.

Jeśli jednak chcesz robić własny protokuł do tego(co jest trochę bez sensu) to masz wiele opcji do wykożystania, wszystko to co może ustanowić połączenie, wysłać i odebrać dane: Sockety, Strumienie i wiele bibiotek które bazują na tym a udostępniają wygodny interfejs.

Link do komentarza
Udostępnij na innych stronach

Najpierw sprawdź czy MySQL obsługuję połączenie ssl jeśli tak to nie ma problemu, a w programie i tak musisz trzymać zakodowane hasło.

Jeśli jednak chcesz zrobić warstwe logiczną osobno to najlepszym rozwiązaniem to zdalne wywoływanie funkcji: CORBA, SOAP(php chyba to obsługuję) itp.

Jeśli jednak chcesz robić własny protokuł do tego(co jest trochę bez sensu) to masz wiele opcji do wykożystania, wszystko to co może ustanowić połączenie, wysłać i odebrać dane: Sockety, Strumienie i wiele bibiotek które bazują na tym a udostępniają wygodny interfejs.

To co piszesz jest dla mnie trochę trudne do zrozumienia (pewnie ze względu na moją mała wiedzę).

 

Jeśli będę trzymać hasło w programie to będzie bardzo prosto je rozkodować, nawet jeśli użyje w kodzie programu funkcji typu szyfr cezara która i tak będzie widoczna po dekompilacji. Pomysł z obsługą skryptów wydaję się dobry, tylko pytanie jak je obsługiwać - czyli wysyłać i pobierać z nich dane?

Link do komentarza
Udostępnij na innych stronach

nie do konca rozumiem, jesli chcesz ograniczyc dostep do operacji na bazie to definiujesz uzytkownika o malym zakresie uprawnien, udostepniasz mu tylko widoki lub widoki + procedury skladowane. W twoim programie user + haslo moze byc jawne bo de facto ograniczenia ustawiasz na poziomie bazy danych.

 

Jakie ma znaczenie czy schowasz baze za php czy corba czy inna warstwa posrednia skoro ta warstwa wykonuje to co kaze program klient ktory musi podac haslo do zalogowania sie, wiec znowu wraca problem hasla i usera.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

nie do konca rozumiem, jesli chcesz ograniczyc dostep do operacji na bazie to definiujesz uzytkownika o malym zakresie uprawnien, udostepniasz mu tylko widoki lub widoki + procedury skladowane. W twoim programie user + haslo moze byc jawne bo de facto ograniczenia ustawiasz na poziomie bazy danych.

 

Jakie ma znaczenie czy schowasz baze za php czy corba czy inna warstwa posrednia skoro ta warstwa wykonuje to co kaze program klient ktory musi podac haslo do zalogowania sie, wiec znowu wraca problem hasla i usera.

OK, do mojego programu to by wystarczyło, ale czy da się zrobić tak (pytam już na przyszłość, żeby później nie odkopywać tego tematu), żeby nadać dostęp do podglądania bazy tylko określonej grupie osób (np. pracowników firmy jakieśtam). Wiem że można by było każdemu z osobna założyć konta MySQL, ale załóżmy, że jest ich około 100 osób więc takie rozwiązanie odpada.

Link do komentarza
Udostępnij na innych stronach

korespondowanie z bazą za pomocą skryptów moim zdaniem nie ma sensu, jest ono dobrym rozwiązaniem w przypadku braku możliwości dostępu do MySQL'a poza serwerem.

Ale jak... ?

Program komunikuje się ze stroną protokołem http (ja w swoim używałem czystych socket'ów i tworzyłem ręcznie protokół).

Następnie program musiał się zalogować (wysłać metodą POST login + hasło użytkownika), po czym dostawał kod ciastka i zapisywał sobie w zmiennej.

Pobieranie informacji ze strony polegało na dekodowaniu treści wysyłanej przez skrypt php.

np.

KOD

soft.php?a=articles&p=2

 

 

powodowało wyświetlenie

 

KOD

Title:"Tytuł strony";Id:"2";Content:"Treść strony ...;]";

 

Program taki ciąg dzielił na tablicę bloków:

KOD

Title:"Tytuł strony"

Id:"2"

Content:"Treść strony ...;]"

 

a to z kolei na tablice zmiennych:

KOD

data_table['Title'] := "Tytuł strony";

data_table['Id'] := "2";

data_table['Content'] := "Treść strony ...;]";

 

 

W przypadku przekroczenia ważności ciastka (w bazie serwisu) program po prostu tracił dostęp do danych i strony zwracały:

KOD

error:00

 

u mnie 00 - brak dostępu = program jest niezalogowany.

 

 

Takie rozwiązanie stosować można jako "panel administracyjny" dla danego serwisu www.

 

Pozdrawiam.

Prawdziwy programista wiesza sie wraz ze swoim programem.

Link do komentarza
Udostępnij na innych stronach

Toster: Jawny login i hasło do bazy nie jest dobrym pomysłem. Nawet jeśli ograniczysz uprawnienia tylko do selecta to każdy będzie mógł podglądać dane innych użytkowników, o insert i update nie wspominając, które mogą nieźle namieszać. De fakto problem z hasłem już nie wraca, każdy użytkownik musi założyć własny login, którego będzie używał do zalogowania się do systemu. A znajomość własnego loginu i hasła nie jest wiedzą wystarczająco do grzebania w bazie danych więc to możemy już sobie jawnie zapisa gdzieś na dysku, no chyba że chcemy ograniczyć możliwość wykradzenia haseł innym użytkownikom, ale to w najgorszym przypadku program nie musi tego zapamiętywać tylko przy każdym uruchomieniu prosić o podanie tych danych.

 

 

 

 

spike: Oddzielenie warstwy loginczej jako osobny server ma sens, i jest powszechnie stosowane, to co ty omówiłeś to zwykłe proxy, które faktycznie nie ma wielkiego sensu.

Link do komentarza
Udostępnij na innych stronach

Blind: Dobrze skonfigurowana baza z odpowiednio ustawionymi prawami, widokami i metodami skladowanymi moze sie sama bronic calkiem dobrze. Propozycja ktora podalem jest przy zalozeniu ze login/haslo jest zaszyte w programie czyli de facto jest jawne. A jasli jest jawne to nie ma znaczenia ile warst posrednich bedzie bo zawsze atakujacy bedzie mial do nich dostep dzieki zdobytemu dostepowi.

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...