Skocz do zawartości

Zabezpieczenie PHP+Mysql+_REQUEST['']


Matrix_

Rekomendowane odpowiedzi

Cześć,

tworzę sobie gierkę, która łączy się ze stroną internetową.

Zwykłe php, na początku Request, i zbiera, wynik i nazwę użytkownika... Później łączy z bazą danych, szuka odpowiedniego użytkownika i podmienia, albo zwiększa jeśli to totalscore. Wszystko działa jak należy.

 

Ale co jak jakaś osoba będzie chciała sobie troszkę zwiększyć wynik? Chodzi o osoby z zespołu albo potencjalnego zbira xD

Zastanawiałem się nad tym, żeby zrobić jakiś _Request['SecretKey']. Wejdę w generator haseł i wrzucę go i do sprawdzenia przez skrypt no i do gry na stałe... Ale nie wiem czy to wgl dobry pomysł.

 

Ponieważ bardziej programuje gry, niż tworzę strony internetowe... A jak kiedyś próbowałem napisać samemu, to dostałem tutaj ochrzan że nie robię zabezpieczeń xD

Ktoś mógłby coś poradzić?

Wgl w pliki php da się zewnętrznie podejrzeć? W sensie przez jakiś pobieracz stron www ktoś i zna ustawienai database user i password?

 

Z góry dziękuję za pomoc :)

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli ktoś zna twój username i passoword do SQL i nie masz ustawionej blokady na IP (domyślnie powinno pozwalać łączyć się tylko przez localhost czyli ten sam komputer na którym jest server i SQL) to może ci skasować całą bazę danych bez potrzeby PHP.

 

Mógłbyś to zrobić przez słowo klucz. Czyli jeżeli jednym z twoich parametrów które wysyłasz jest nick a drugim liczba punktów to możesz dodać trzeci który będzie stringiem typu "jibv7e8ashgvhiusegv" A potem porównywać go if'em w PHP. W ten sposób ktoś nie wywoła twojego zapytania bez znajomości klucza.

 

Tylko że to jest bardzo słabe zabezpieczenie, a praktycznie zerowe. Jeżeli ktoś dokopałby Ci się do kodu to mógłby wyjąć klucz. A może nawet da się użyć jakiegoś narzędzia które sczytuje ruch sieci i po prostu wyjąć ten parametr. W sumie to sam chciałbym się dowiedzieć czegoś takiego.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli ktoś zna twój username i passoword do SQL i nie masz ustawionej blokady na IP (domyślnie powinno pozwalać łączyć się tylko przez localhost czyli ten sam komputer na którym jest server i SQL) to może ci skasować całą bazę danych bez potrzeby PHP.

 

Mógłbyś to zrobić przez słowo klucz. Czyli jeżeli jednym z twoich parametrów które wysyłasz jest nick a drugim liczba punktów to możesz dodać trzeci który będzie stringiem typu "jibv7e8ashgvhiusegv" A potem porównywać go if'em w PHP. W ten sposób ktoś nie wywoła twojego zapytania bez znajomości klucza.

 

Tylko że to jest bardzo słabe zabezpieczenie, a praktycznie zerowe. Jeżeli ktoś dokopałby Ci się do kodu to mógłby wyjąć klucz. A może nawet da się użyć jakiegoś narzędzia które sczytuje ruch sieci i po prostu wyjąć ten parametr. W sumie to sam chciałbym się dowiedzieć czegoś takiego.

Właśnie chodzi o to że serwer nie jest u mnie na komputerze :/

Ale zakładając że sql jest bezpieczne... Bo to już dobry hacker musiałby być chyba....

 

Myślałem nad tym stringiem ale też tak sobie pomyślałem że łatwo to przechwycić.

Chyba że najpierw wysłanie zapytania. Pobranie kodu który jest szyfrowany i wtedy... Połączenie...

 

Pewnie trzeba kupić coś takiego :/

Odnośnik do komentarza
Udostępnij na innych stronach

Co rozumiesz przez zdanie że sql jest bezpieczne?

Jak się łączysz z bazą sql? przez server czy przez clienta( w sensie dajesz użytkownikowi dane do logowania do bazy? Jeśli tak to na jakich uprawnieniach? )

Zresztą dawanie jakichkolwiek uprawnień logowania do bazy jest bez sensu bo z łatwością można ją wtedy przyblokować.

Odnośnik do komentarza
Udostępnij na innych stronach

Co rozumiesz przez zdanie że sql jest bezpieczne?

Jak się łączysz z bazą sql? przez server czy przez clienta( w sensie dajesz użytkownikowi dane do logowania do bazy? Jeśli tak to na jakich uprawnieniach? )

Zresztą dawanie jakichkolwiek uprawnień logowania do bazy jest bez sensu bo z łatwością można ją wtedy przyblokować.

W sensie, że nikt oprócz mnie nie zna - no chyba że hacker.

Na stronie internetowej w skrypcie który dodaje punkty jest includowany plik php z ustawieniami.

Client/Gra wpisuje tylko adres podając login i wynik. A na stronie internetowej, następuje połączenie z bazą danych i update wyniku.

Odnośnik do komentarza
Udostępnij na innych stronach

No to jest bezpieczne.

Oczywiście każdy może sobie dowolny wynik wpisać.

I tu można tylko robić utrudnienia bo nie ma zabezpieczeń(pewnych) dla gier po stronie clienta, zdolna osoba zawsze znajdzie obejście.

W związku z tym wszelkie wrażliwe rzeczy jak np naliczanie punktów musza się dziać po stronie serwera.

 

Oczywiście jeśli to prosta gierka wystarczy nałożyć parę zabezpieczeń i liczyć na to że żaden geniusz nie weźmie tego za wyzwanie : )

 

Natomiast jakie zabezpieczenia zastosować to już w głównej mierze zależy od tego w czym robisz clienta. Jeśli to plik wykonywalny to możesz wbudowac funkcje hashującą która będzie hashowac wynik. czyli wysyłasz login + wynik + hash(wynik), serwer odbiera to i tez hashuje wynik. Sprawdza czy oba hashe są identyczne jeśli tak to ok i może wysłać do bazy. W ten sposób ktoś będzie musiał odbudować funkcję hashująca którą wymyśliłeś(co jest bardzo trudne) by wprowadzać własne wyniki(choć wciąż będzie mógł sklonować swój wynik wielokrotnie wysyłając to samo - rozwiązaniem może być przechowywanie tylko jednego najlepszego wyniku dla każdego gracza, wtedy hashujesz całość i wysyłasz login + wynik + hash(login+wynik))

Odnośnik do komentarza
Udostępnij na innych stronach

No to jest bezpieczne.

Oczywiście każdy może sobie dowolny wynik wpisać.

I tu można tylko robić utrudnienia bo nie ma zabezpieczeń(pewnych) dla gier po stronie clienta, zdolna osoba zawsze znajdzie obejście.

W związku z tym wszelkie wrażliwe rzeczy jak np naliczanie punktów musza się dziać po stronie serwera.

 

Oczywiście jeśli to prosta gierka wystarczy nałożyć parę zabezpieczeń i liczyć na to że żaden geniusz nie weźmie tego za wyzwanie : )

 

Natomiast jakie zabezpieczenia zastosować to już w głównej mierze zależy od tego w czym robisz clienta. Jeśli to plik wykonywalny to możesz wbudowac funkcje hashującą która będzie hashowac wynik. czyli wysyłasz login + wynik + hash(wynik), serwer odbiera to i tez hashuje wynik. Sprawdza czy oba hashe są identyczne jeśli tak to ok i może wysłać do bazy. W ten sposób ktoś będzie musiał odbudować funkcję hashująca którą wymyśliłeś(co jest bardzo trudne) by wprowadzać własne wyniki(choć wciąż będzie mógł sklonować swój wynik wielokrotnie wysyłając to samo - rozwiązaniem może być przechowywanie tylko jednego najlepszego wyniku dla każdego gracza, wtedy hashujesz całość i wysyłasz login + wynik + hash(login+wynik))

Dziękuję bardzo za odpowiedź... :)

Jeśli chodzi o to hashowanie, to:

 

Powiedzmy mam: użytkownika - gracz i jego wynik - 1000.

Gra wchodzi na link:

game.php?action=addscore&użytkownik=gracz&wynik=1000&hash=g1r0a0c0z0 (powiedzmy ze tak wygląda kodowanie moje kodowanie "gracz_1000")

 

GML
//A serwer/strona czyta:

user= gracz;

score= 1000;

hash = g1r0a0c0z0;

h_user = encode(hash,0); //funkcja encodująca pozycja 1(przed "_")

h_score = encode(hash,1); //funckja encodująca pozycja 2(po "_")

if(h_user == user && h_score== score){

//wyślij dane

}else{

//zbanuj usera bo hacker :D

}

 

Tak to ma mniej więcej działać?

Odnośnik do komentarza
Udostępnij na innych stronach

Dokładnie tak, tylko hashowanie samego nicku gracza nie ma sensu jesli chcesz opcje z nickiem to połącz nick z punktami do jednego stringu i hashuj całość.

 

Pamiętaj że w tej wersji powinieneś sprawdzić czy dany użytkownik ma już wynik w bazie i jeśli tak to sprawdzasz czy obecny jest większy, jeśli ponownie odpowiedź to tak to wtedy aktualizujesz jego wynik na ten lepszy(jesli mniejszy to nie zapisujesz nic). Jeśli go jeszcze nie ma to oczywiście normalnie wpisujesz.

Jeśli nie rozumiesz dlaczego tak to wygląda, mogę spróbować wytłumaczyć.

 

EDIT: nie, moment musze na to spojrzeć jeszcze raz

 

źle, za szybko popatrzyłem. Funkcja hashująca to jest coś co zna client i server ale nie osoba postronna. Mozna to traktować jak podpis, piszesz list do znajomego i ustalacie że na końcu aby miał on pewność że list jest od Ciebie, napiszesz 10 ostatnich samogłosek które użyłeś w liście. Teraz jak ktoś kto o tym nie wie spróbuje się podszyć i nie dopisze tych samogłosek to twój przyjaciel będzie wiedział że to fałszywka.

Wiec uwzględniając co napisałem wyżej powinno być tak:

 

 

GML
//A serwer/strona czyta:

user= gracz;

score= 1000;

hash = g1r0a0c0z0; //to wyszlo z hashowania tak samo jak linijka nizej tylko w cliencie

h_hash = encode(string(user)+string(score)); //hashujesz polaczone

// teraz sprawdzasz czy to co policzyl client to to samo co tobie wyszlo z hashowania danych na serwerze

// porównując do przykładu z listem, jest to wzięcie 10 ostatnich liter z listu i sprawdzenie czy zgadzają się

// z 10 ostatnimi samogłoskami(nie licząc samych ostatnich 10 oczywiscie, które sa podpisem: ) )

if( hash == h_hash){

//wyślij dane( spradź czy to najwzyszy wynik tego gracza)

}else{

//zbanuj usera bo hacker :D

}

 

Teraz żeby wpisac coś do bazy wrogo nastawiona osoba musi podac jakiś nick, punkty które chce sobie zhakować i hash -> tylko skąd go wziąć bez ostrej dissasemblacji?( zakładając że masz mocna funkcję hashującą )

Odnośnik do komentarza
Udostępnij na innych stronach

Dokładnie tak, tylko hashowanie samego nicku gracza nie ma sensu jesli chcesz opcje z nickiem to połącz nick z punktami do jednego stringu i hashuj całość.

 

Pamiętaj że w tej wersji powinieneś sprawdzić czy dany użytkownik ma już wynik w bazie i jeśli tak to sprawdzasz czy obecny jest większy, jeśli ponownie odpowiedź to tak to wtedy aktualizujesz jego wynik na ten lepszy(jesli mniejszy to nie zapisujesz nic). Jeśli go jeszcze nie ma to oczywiście normalnie wpisujesz.

Jeśli nie rozumiesz dlaczego tak to wygląda, mogę spróbować wytłumaczyć.

 

EDIT: nie, moment musze na to spojrzeć jeszcze raz

 

źle, za szybko popatrzyłem. Funkcja hashująca to jest coś co zna client i server ale nie osoba postronna. Mozna to traktować jak podpis, piszesz list do znajomego i ustalacie że na końcu aby miał on pewność że list jest od Ciebie, napiszesz 10 ostatnich samogłosek które użyłeś w liście. Teraz jak ktoś kto o tym nie wie spróbuje się podszyć i nie dopisze tych samogłosek to twój przyjaciel będzie wiedział że to fałszywka.

Wiec uwzględniając co napisałem wyżej powinno być tak:

 

 

GML
//A serwer/strona czyta:

user= gracz;

score= 1000;

hash = g1r0a0c0z0; //to wyszlo z hashowania tak samo jak linijka nizej tylko w cliencie

h_hash = encode(string(user)+string(score)); //hashujesz polaczone

// teraz sprawdzasz czy to co policzyl client to to samo co tobie wyszlo z hashowania danych na serwerze

// porównując do przykładu z listem, jest to wzięcie 10 ostatnich liter z listu i sprawdzenie czy zgadzają się

// z 10 ostatnimi samogłoskami(nie licząc samych ostatnich 10 oczywiscie, które sa podpisem: ) )

if( hash == h_hash){

//wyślij dane( spradź czy to najwzyszy wynik tego gracza)

}else{

//zbanuj usera bo hacker :D

}

 

Teraz żeby wpisac coś do bazy wrogo nastawiona osoba musi podac jakiś nick, punkty które chce sobie zhakować i hash -> tylko skąd go wziąć bez ostrej dissasemblacji?( zakładając że masz mocna funkcję hashującą )

Dzięki jeszcze raz :) Wydaje mi się że rozumiem.

Operowanie bazą danych nawet mi idzie, i puki co wszystko działa jak należy.

 

Hm.. to encodowanie wygląda obiecująco. Tak się zastanawiam nad tą funckją hashującą jak ją należałoby zrobić.

Normalny gracz jak przez przypadek zostawię gdzieś link otwarty na screenie to nie ogarnie tego. Taki który to zrozumie położy się na hashu...

Dopiero hacker będzie próbował, ale nie opyla się tego robić na grze, która będzie sprzedawana po 20zł w najlepszym wypadku i liczba użytkowników to pewnie kilkaset osiągnie :P

 

Wydaje mi się że nie musi to być jakiś hash który literkę " A " zapisuje jako " k/[7B " to byłaby chyba przesada dla mojego projektu projektu i tak dla każdej litery z alfabetu...

Bo nie wiem czy jakoś prosto to się robi. Czy może po prostu zamienienie cyfer na litery/znaki-specjalne i niektóre litery na znaki bądź cyfry to wystarczy?

Odnośnik do komentarza
Udostępnij na innych stronach

Właśnie chodzi o to że serwer nie jest u mnie na komputerze :/
Tu chodzi o to że serwer HTTP, serwer PHP i server SQL są na tym samym komputerze. I prawie na pewno są. Wystarczy że sprawdzisz w PHP przy połączeniu serwera co wpisujesz jako parametr. Jeżeli localhost to servery są na tym samym sprzęcie. Jeżeli podajesz tam specjalne IP albo adres to serwer jest w innej lokacji. Ale to nie istotne.

 

Wydaje mi się że nie musi to być jakiś hash który literkę " A " zapisuje jako " k/[7B " to byłaby chyba przesada dla mojego projektu projektu i tak dla każdej litery z alfabetu...

Bo nie wiem czy jakoś prosto to się robi. Czy może po prostu zamienienie cyfer na litery/znaki-specjalne i niektóre litery na znaki bądź cyfry to wystarczy?

To nie jest hash tylko szyfr. Hashu nie można odkodować. I masz używać hashu. Zasada jest taka że hashujesz tym samym sposobem te same dane po obu stronach a potem porównujesz czy są identyczne.
Odnośnik do komentarza
Udostępnij na innych stronach

Tu chodzi o to że serwer HTTP, serwer PHP i server SQL są na tym samym komputerze. I prawie na pewno są. Wystarczy że sprawdzisz w PHP przy połączeniu serwera co wpisujesz jako parametr. Jeżeli localhost to servery są na tym samym sprzęcie. Jeżeli podajesz tam specjalne IP albo adres to serwer jest w innej lokacji. Ale to nie istotne.

 

To nie jest hash tylko szyfr. Hashu nie można odkodować. I masz używać hashu. Zasada jest taka że hashujesz tym samym sposobem te same dane po obu stronach a potem porównujesz czy są identyczne.

Rozumiem...

 

Najlepiej pisać samemu takie hashery czy użyć czegoś już zrobionego i wykorzystać np. sha1() albo md5() ?

Odnośnik do komentarza
Udostępnij na innych stronach

Hashe ogólnie zawsze powinny być tej samej długości(nie jest to konieczne, ale ważne jeśli chce się zwiększyć bezpieczeństwo).

 

Możesz wybrać sobie jakąś liczbę startową np

a = 9;

potem robisz fora po połączonym stringu nazwy gracza i wyniku i przemnazasz:

for( i=0; i<string_length(polaczonystring); ++i)

a = a * (jakaś liczba pierwsza) + wartosc asci i-tej literki w połączonym stringu.

 

Mogą szybko wychodzic duze liczby więc dodatkowo za każdym razem możesz robić modulo jakaś duża liczba pierwsza.

W ten sposób dostaniesz liczbę powiązaną z tym słowem. Zastępowania jest raczej zlym pomysłem bo jeśli nie jest skomplikowane to można je rozgryźć w parę minut( i to bardziej szyfrowanie niż hashowanie choć nie do końca :) ).

 

Do takiego czegoś musisz użyć swojego, osoby bawiące się takim czymś zazwyczaj znają wygląd sha1 czy md5 i na pewno spróbują czy tego nie użyłeś. Wtedy po prostu przepuszczą to co chcą wstawić i dostaną hash. To musi być coś czego inni nie będą znali.

Odnośnik do komentarza
Udostępnij na innych stronach

Hashe ogólnie zawsze powinny być tej samej długości(nie jest to konieczne, ale ważne jeśli chce się zwiększyć bezpieczeństwo).

 

Możesz wybrać sobie jakąś liczbę startową np

a = 9;

potem robisz fora po połączonym stringu nazwy gracza i wyniku i przemnazasz:

for( i=0; i<string_length(polaczonystring); ++i)

a = a * (jakaś liczba pierwsza) + wartosc asci i-tej literki w połączonym stringu.

 

Mogą szybko wychodzic duze liczby więc dodatkowo za każdym razem możesz robić modulo jakaś duża liczba pierwsza.

W ten sposób dostaniesz liczbę powiązaną z tym słowem. Zastępowania jest raczej zlym pomysłem bo jeśli nie jest skomplikowane to można je rozgryźć w parę minut( i to bardziej szyfrowanie niż hashowanie choć nie do końca :) ).

 

Do takiego czegoś musisz użyć swojego, osoby bawiące się takim czymś zazwyczaj znają wygląd sha1 czy md5 i na pewno spróbują czy tego nie użyłeś. Wtedy po prostu przepuszczą to co chcą wstawić i dostaną hash. To musi być coś czego inni nie będą znali.

Ok dzięki wielkie,

może mi się uda coś wykombinować :)

Odnośnik do komentarza
Udostępnij na innych stronach

a propos haszy: md5 już dawno zostało złamane (tj. da się zekodować ciąg md5, jeśli źródłowy string mieści się rozmiarem w zakresie długości md5 (i zwykle mieści, jeśłi chce się mieć pewność, że nie będzie powtarzających się haszy dla różnych wartości)) i nie zaleca się stosowania go do czegokolwiek, a jak sha to tylko 256 i wyżej.

 

a co do własnej metody haszowania to Danielus dobrze naprowadza, aczkolwiek nigdy nie stosuj żadnej wariacji tego kodu:

GML
a = 9;

for( i=0; i<string_length(polaczonystring); ++i)

a = a * (jakaś liczba pierwsza) + wartosc asci i-tej literki w połączonym stringu.

gdyż zakres liczbowy jest ograniczony i tym kodem mocno ograniczasz sobie długość maksymalną możliwego do haszowania stringa. nie napiszesz dobrej metody haszowania (niepowtarzalnego) sam z palca, nim nie doczytasz dogłębnie jak działają istniejące metody (ponownie: omijak md5 i sha < 256), oraz nie chwal się swoim kodem, a wtem zrobisz to dobrze i bezpiecznie.

Odnośnik do komentarza
Udostępnij na innych stronach

Złamanie md5 nic nie wnosi do jego problemu, a tylko niepotrzebnie mu sugerujesz że może użyć sha. zauważ że on nie składa pospisu cyforwego, tylko chce potwierdzić autentyczność wyników. Najlepsze w tym wypadku byłoby własne szyfrowanie, ale hashe są po prostu prostsze do zrobienia. On choćby chciał to nie może użyć nawet sha, tylko musi napisać własną metodę.

 

Mój kod w żadnen sposób nie ogranicza długości stringu, po prostu szybciej zaczną występować kolizje, on nie potrzebuje spędzić połowy życia analizaując działanie funkcji mieszających zahaczając po drodze o doktorat by zrobić proste zabezpieczenie do gry. Zresztą po co robić skomplikowane skoro zawsze dla atakującego jest pewna równowaga: robić dissasemblacje kodu czy skupić się na wynikach które wyrzuca program. Jak funkcja będzie zbyt trudna to zrobi dissamblacje i użyje twojego skomplikowanego hashowania ręcznie na swoich danych( w przypadku takiego użycia jak jest tutaj potrzebne )

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki wszystkim za rady.

Faktycznie myślę że nie potrzebuję doktoratu z tej dziedziny.

Coś tam udało mi się spłodzić, zobaczymy jak będzie to działać w praktyce.

 

Ale na razie nie muszę się martwić o hackerów, bo w grę grają 3 osoby haha

Reszta jednorazowo... :/

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności
Złamanie md5 nic nie wnosi do jego problemu, a tylko niepotrzebnie mu sugerujesz że może użyć sha. zauważ że on nie składa pospisu cyforwego, tylko chce potwierdzić autentyczność wyników. Najlepsze w tym wypadku byłoby własne szyfrowanie, ale hashe są po prostu prostsze do zrobienia. On choćby chciał to nie może użyć nawet sha, tylko musi napisać własną metodę.
Sha a podpis cyfrowy, to zupełnie różne sprawy. Według mnie, nie ma co się silić na własne funkcje szyfrujące, ponieważ nie pobije on matematyków i speców od kryptografii i spędzili lata nad doskonaleniem algorytmów.

 

Mój kod w żadnen sposób nie ogranicza długości stringu, po prostu szybciej zaczną występować kolizje, on nie potrzebuje spędzić połowy życia analizaując działanie funkcji mieszających zahaczając po drodze o doktorat by zrobić proste zabezpieczenie do gry. Zresztą po co robić skomplikowane skoro zawsze dla atakującego jest pewna równowaga: robić dissasemblacje kodu czy skupić się na wynikach które wyrzuca program. Jak funkcja będzie zbyt trudna to zrobi dissamblacje i użyje twojego skomplikowanego hashowania ręcznie na swoich danych
Ściągnięcie tego dodatku i wykorzystanie w projekcie, będzie o rzędy długości szybsze i łatwiejsze niż projektowanie własnych funkcji zabezpieczających. A i doktoratu pisać nie musi.

 

Odnośnik do komentarza
Udostępnij na innych stronach

Sha a podpis cyfrowy, to zupełnie różne sprawy. Według mnie, nie ma co się silić na własne funkcje szyfrujące, ponieważ nie pobije on matematyków i speców od kryptografii i spędzili lata nad doskonaleniem algorytmów.

 

Ściągnięcie tego dodatku i wykorzystanie w projekcie, będzie o rzędy długości szybsze i łatwiejsze niż projektowanie własnych funkcji zabezpieczających. A i doktoratu pisać nie musi.

Ładnie to wygląda, ale...

..niestety muszę to zrobić w PHP i w C#(Unity)

Odnośnik do komentarza
Udostępnij na innych stronach

e, no to jeszcze prościej! w C# masz biblioteki, które obsługują popularne metody hashowania - tak samo w php. nie zastanawiaj się, tylko korzystaj :D

(wszyscy chyba myśleliśmy, że robisz to w GMie, stąd takie odpowiedzi były xD)

Odnośnik do komentarza
Udostępnij na innych stronach

Ludzie czy wy nie rozumiecie że on nie może użyć żadnej znanej metody hashowania?

Przeczytajcie jeszcze raz o co się rozchodzi i dlaczego w tym przypadku to bardziej przypomina szyfrowanie niż hashowanie.

 

Bo to już będzie drugi albo nawet i trzeci raz gdy dokładnie zaznaczam że znane i co ważniejsze popularne hashowania odpadają.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...