Autor Wątek: Bespieczeństwo baz danych  (Przeczytany 3851 razy)

Offline Krolik

  • Użytkownik

# Marzec 03, 2010, 02:53:48
Chciałbym w przyszłości zrobić jakąś grę online w której będą zapamiętywane nasze osiągnięcia itp czyli baza danych. W tym celu zamierzam korzystać z (x)html, JS, AJAX i PHP + Mysql. Dopiero zaczynam więc niewiele mam informacji na ten temat, ale chciałbym zapytać tak ogólnie czy proste zapespieczenia konta hasłem (login hasło) wystarczą, aby chronić dane urzytkowników? Co powinienem mieć na serwerze, aby nikt nie miał dostępu do danych? Czy łatwo się włamać i namieszać w bazach?

Prosił bym osoby mające jakąś wiedzę na ten temat aby się wypowiedziały jak to w praktyce wygląda.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline MichalBe

  • Użytkownik
    • MichalBe's Github

# Marzec 03, 2010, 03:11:18
myślę że dużo łatwiej zadbać o "użytkowników" niż "urzytkowników" ale to moja prywatna teoria.

Offline Netrix

  • Redaktor
    • Netrix’s devBlog

# Marzec 03, 2010, 07:59:28
Jak również i "zabezpieczenie" oraz "bezpieczeństwo".

Offline msieradzki

  • Użytkownik

# Marzec 03, 2010, 10:37:24
Na pewno wypada przechowywać hash z haseł zamiast jawnego tekstu. Większość stron może spokojnie używać OpenID zamiast samemu bawić się w takie rzeczy. Co do samej bazy to PHP uruchamiasz z ograniczonymi uprawnieniami jak możesz np. strona ma użytkowników i adminów. Jak widzisz żądanie od użytkownika to łączysz się do bazy z innego konta bazy danych.

Offline hashedone

  • Użytkownik

# Marzec 03, 2010, 10:51:56
Włamanie się do samej bazy danych jest niezwykle trudne (tak samo jak włamanie się bezpośrednio na serwer ftp i podmiana plików z grą). To źle oprogramowane połączenia z bazą pozwalają na ataki SQL-Injection. Co do przetrzymywania hashy zamiast pełnych haseł jest w tym kontekście bzdurą, jeśli ktoś już by ci się włamał do bazy, wystarczy, że wyśle sobie zapytanie w stylu:
UPDATE tabela_graczy SET md5_hasla='0cc175b9c0f1b6a831c399e269772661' WHERE login='gracz_do_shackowania'
I chasło zmienia się na 'a'. Wystarczy wyczaić jaka suma kontrolna jest zastosowana (zastosowanie własnej to proszenie się o kolizje co już w ogóle jest chore).

Inna rzecz, że nie należy trzymać w bazie haseł, a właśnie checksumy, ale z innego powodu: pisząc kod komunikacji z bazą praktycznie zawsze narażamy się na SQL-Injection (nawet jeśli się wydaje że kod jest doskonały, może się okazać że ktoś doskonalszy od nas umie go wykożystać). Mamy więc pewne zabezpieczenie, że nawet jeśli komuś uda się wykonać SELECT na bazie, nie pozna jawnego hasła gracza.

Co do ochrony - login/hasło wystarcza. Można dodać zabezpieczenie jakieś antybotowe żeby gracze nie ułatwiali sobie życia. Tyle że pomyśl o tym, że tego typu aplikacje wymagają użycia jakiegokolwiek mechanizmu podobnego do sesji. Musisz więc zabezpieczyć się przed przechwyceniem/niepowołanym użyciem sid, aby uniemożliwić zwykłe ominięcie hasła.

Offline Kos

  • Użytkownik
    • kos.gd

# Marzec 03, 2010, 10:55:46
Wystarczy wyczaić jaka suma kontrolna jest zastosowana (zastosowanie własnej to proszenie się o kolizje co już w ogóle jest chore).

Po to przecież solimy nasze hasze. :) Wtedy ani przeczytanie, ani podmiana md5 nikomu nic nie da, dopóki ofc nie dostanie źródełek gry.

Offline Zielony

  • Użytkownik
    • Ghurund Engine

# Marzec 03, 2010, 11:33:39
Inna rzecz, że nie należy trzymać w bazie haseł, a właśnie checksumy, ale z innego powodu: pisząc kod komunikacji z bazą praktycznie zawsze narażamy się na SQL-Injection (nawet jeśli się wydaje że kod jest doskonały, może się okazać że ktoś doskonalszy od nas umie go wykożystać). Mamy więc pewne zabezpieczenie, że nawet jeśli komuś uda się wykonać SELECT na bazie, nie pozna jawnego hasła gracza.
Do pola na hasło bez escapowania znaków specjalnych podajesz "Ala ma kopa' and '1'='1" i checksum nie pomoże.

Offline siso

  • Użytkownik

# Marzec 03, 2010, 11:59:08
Zastanówmy się nad jednym: jeśli ktoś się włamie do serwera bazy, to po jaki grzyb ma kombinować podmianę hasła do konta, skoro może sobie (potencjalnie) podrasować swoje własne? :) Chyba prościej jest założyć konto normalnie i dopisać sobie odpowiednią ilość zasobów czy czego tam chcesz.

SQL-injection staje się groźne wtedy, kiedy programista był na tyle nieostrożny, żeby przesyłać zapytania w urlu. To woła o pomstę o do nieba w całej rozciągłości. Broń Boże wsadzić w takiego urla jkiegoś update'a. Niezdrowo jest też wysyłać zapytania z poziomu forma. Mało tego - operowanie (mniej lub bardziej jawne) na ID-kach (przekazywanie ich do wywołań etc.) to tez jest proszenie się o kłopoty - wystarczy, ze ktoś wstawi do urla inne ID i po bajce. Jeśli chcesz ukryć wszystko możliwie najbezpieczniej, wystaw klientowi bardzo ograniczone API, aby tylko mógł odpytać lub poprosić tylko o niezbędne rzeczy w bezpieczny, całkowicie customowy sposób. Sposób, który Ty mu narzucisz.

Kwestia "co będzie jak się ktoś dostanie na serwer" to już jest całkiem inna bajka. Zakładaj wtedy, że jest po wszystkim, bo można zrobić wszystko, włącznie z wyczyszczeniem danych.

Offline Liosan

  • Redaktor

# Marzec 03, 2010, 12:02:20
Mało tego - operowanie (mniej lub bardziej jawne) na ID-kach (przekazywanie ich do wywołań etc.) to tez jest proszenie się o kłopoty - wystarczy, ze ktoś wstawi do urla inne ID i po bajce. Jeśli chcesz ukryć wszystko możliwie najbezpieczniej, wystaw klientowi bardzo ograniczone API, aby tylko mógł odpytać lub poprosić tylko o niezbędne rzeczy w bezpieczny, całkowicie customowy sposób. Sposób, który Ty mu narzucisz.
Jak nie idki, to co?

Liosan

Offline Kos

  • Użytkownik
    • kos.gd

# Marzec 03, 2010, 12:10:31
ID-ki i formularze do tego właśnie przecież służą, nie głośmy herezji. User wypełnia forma / klika w link i wysyła w ten sposób żądanie, skrypt je analizuje, sprawdza pod kątem poprawności (np. uprawnienia, spójność, zgodność z logiką systemu) i - jeśli potrzeba - uaktualnia model danych, czyli bazę. Tak to działa i działać powinno.

Jeśli coś zmieniać, to można najwyżej poprzenosić część obowiązków z jednego miejsca w drugie, np. przenieść logikę do samej bazy (czyt. wprowadzić w niej system uprawnień i/lub zapewnić interfejs poprzez widoki tudzież procedury składowane).

Offline Meic

  • Użytkownik

# Marzec 03, 2010, 13:52:28
W sumie najłatwiej chronić bazę poprzez jak najbardziej surową walidację danych (z tym, że tu już trzeba przewidzieć wszystko co może zostać podane przez usera i jest prawidłowe z punktu widzenia skryptu) i wykonywanie skryptów za pomocą kont-bazodanowych o odpowiednio ograniczonych uprawnieniach (np. tylko selecty). Ewentualnie można jeszcze wprowadzić jakieś oznaczenie do samych rekordów i "opóźniać" wykonanie "niebezpiecznych" operacji. Chodzi mi tu o dodanie do wiersza np. komórki "skasowany". Podczas samej gry, przy usuwaniu takiego rekordu ustawia się tą flagę na 1 (co determinuje pomijanie tych danych w innych operacjach), a potem można przejrzeć raz na jakiś czas te oznaczone dane i jeśli nie ma nic podejrzanego to skasować je "fizycznie". Przy takim sposobie, nawet jak ktoś namiesza i skasuje w ten sposób całą bazę (tabele, whatever), dane nie przepadają (no, ale jest to dość kłopotliwe  :)). Tak, że ja stawiał bym głównie na walidację.

Offline MichalBe

  • Użytkownik
    • MichalBe's Github

# Marzec 03, 2010, 14:27:44
prawda jest taka ze jak korzystasz z jakiegokolwiek w miarę ogarniętego frejmłorka to żadnymi incejtionami sie martwić nie musisz.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Marzec 03, 2010, 14:48:30
Cytuj
Wystarczy wyczaić jaka suma kontrolna jest zastosowana (zastosowanie własnej to proszenie się o kolizje co już w ogóle jest chore).
Napisanie własny algorytm sumy kontrolnej dający odpowiedni bezkolizyjny rozrzut jest bardzo łatwym zadaniem. Problem raczej w tym, że takie własne pomysły na algorytmy sumy kontrolnej najczęściej są dość łatwo odwracalne. W przypadku wielu prostych algorytmów (np. CRC32) mając hash i znając algorytm oraz długość hasła można bez większego problemu to hasło odtworzyć.

Offline Krolik

  • Użytkownik

# Marzec 03, 2010, 15:24:17
Wybaczcie za błędy o 2 nad ranem jest ciężej coś wyłapać. Dzieki za odpowiedzi.

Offline msieradzki

  • Użytkownik

# Marzec 03, 2010, 16:34:59