[Rozwiązany][MySql+PHP]Rejestracja oraz szyfrowanie

0

Witam! Po obiciu się o różne technologie, języki programowania itd. przechodzę do innego projektu, realnego i mam nadzieję, że prostego do wykonania. Żeby nie było, że pisze tylko bo mam problem ze zrobieniem rejestracji, to napiszę też o szyfrowaniu. Ale najpierw rejestracja, buduję ją do własnych potrzeb, dlatego może być troche "pomieszana". Plik sql1.php

<?php
    $connection = @mysql_connect('adres serwera oczywiscie te dane sa wpisane', 'nick', 'haslo')
    or die('Brak połączenia z serwerem MySQL');
    $db = @mysql_select_db('nazwa bazy danych', $connection)
    or die('Nie mogę połączyć się z bazą danych');
?>

Plik register.php

<html>
<?php
include("include/head.php");
// include("include/sql1.php");
?>
<body>
<h1>Rejestracja</h1>
<h2>Utwórz swoje konto gry WorldWar3</h2>
<br><br>
Regulamin<br>
<?
//jesli byl wyslany formularz przechodzimy do obsługi danych
if(isset($_POST['wyslij']))
{
    foreach ($_POST AS $klucz => $wartosc)
    {
        $wartosc= trim($wartosc);
          if (get_magic_quotes_gpc())
              $wartosc= stripslashes($wartosc);
        $wartosc=htmlspecialchars($wartosc, ENT_QUOTES);
        $_POST[$klucz]=$wartosc;
    }

$nick = $_POST['nick'];
$poziom = "1";
$haslo = $_POST['haslo'];
       $haslopoprawne = md5($_POST['haslo']);
$email = $_POST['email'];
       $emailpoprawny = md5($_POST['email']);
$data = date('jS F Y');
$datazalogowania = date('jS F Y');
$nazwapanstwa = $_POST['nazwapanstwa'];
$avatar = $_POST['avatar'];

    $blad_txt='';
    $blad=false;
    if(strlen($nick)<4){
        $blad_txt.='<font color=\'#990000\'>Pole <b>1</b>: nick za krótki (min.4 znaki).</font><br/>';
        $blad=true;
    }
    if(strlen($nick)>16){
        $blad_txt.='<font color=\'#990000\'>Pole <b>1</b>: nick za długi (maks.16 znaków).</font><br/>';
        $blad=true;
    }

    if(strlen($haslo)<4){
        $blad_txt.='<font color=\'#990000\'>Pole <b>2</b>: hasło za krótkie (min.4 znaki).</font><br/>';
        $blad=true;
    }
    if(strlen($haslo)>16){
        $blad_txt.='<font color=\'#990000\'>Pole <b>2</b>: hasło za długie (maks.16 znaków).</font><br/>';
        $blad=true;
    }

    //sprawdzamy czy jest podany prawidłowy adres e-mail
    if(!preg_match('|^[_a-z0-9.-]*[a-z0-9]@[_a-z0-9.-]*[a-z0-9].[a-z]{2,3}$|e', $email)){
        $blad_txt.='<font color=\'#990000\'>Pole <b>3</b>: nieprawidłowy adres e-mail</font><br/>';
        $blad=true;
    }

    if(!$blad)
    {
        //zapisywanie poprawnych danych do bazy danych
        include("include/sql1.php");
        If($nick == 'DaRkMAN'){
        $poziom = "9";
        }
        //zapytanie dodające zmienne $imie i $nazwisko do bazy
        $zapytanie = "CREATE TABLE $nick (
        poziom VARCHAR(1),
        haslo VARCHAR(255),
        email VARCHAR(255),
        data VARCHAR(15),
        datazalogowania VARCHAR(15),
        nazwapanstwa VARCHAR(50),
        avatar VARCHAR(80),
        )
        INSERT INTO $nick VALUES ('$poziom','$haslopoprawne','$emailpoprawny','$data','$datazalogowania','$nazwapanstwa','$avatar')";
        $idzapytania = mysql_query($zapytanie);
        if($idzapytania)      echo '<font color=\'#00FF00\'>Zarejestrowano poprawnie</font>';
        else            echo '<font color=\'#990000\'>Błąd podczas dodawania</font>';
    }
    else
    {
        echo $blad_txt;
    }
}
else
{

$nick = '';
$poziom = "1";
$haslo = '';
$email = '';
$data = date('jS F Y');
$datazalogowania = date('jS F Y');
$nazwapanstwa = '';
$avatar = '';
}

//wyswietlamy formularz
echo '<form action="'.$_SERVER['PHP_SELF'].'" method="POST">
<table>
<tr><td></td><td><b>Informacje podstawowe:<b></td></tr>
<tr><td>1.</td><td>Nick*:</td><td><input type="text" name="nick" value="'.$nick.'"></td></tr><br><br>
<tr><td>5.</td><td>Nazwa państwa w grze:</td><td><input type="text" name="nazwapanstwa" value="'.$nazwapanstwa.'"></td></tr>
<tr><td>2.</td><td>Haslo*:</td><td><input type="password" name="haslo" value="'.$haslo.'"></td></tr>
<tr><td>3.</td><td>E-mail*:</td><td><input type="text" name="email" value="'.$email.'"></td></tr>
<tr><td>20.</td><td>Avatar(adres pliku):</td><td><input type="text" name="avatar" value="'.$avatar.'"></td></tr>
<tr><td></td><td></td><td><input type="reset" value="Wyczyść" />&nbsp;&nbsp;<input type="submit" name="wyslij" value="Wyślij"></td></tr>
</table>
</form>';
?>

Ok, teraz o co w tym kodzie chodzi: Wypełniamy formularz (nie jest skończony, skończę jak zrobię "silnik") piszemy sobie swój nick, hasło i reszte. Nick jest zapisywany do zmiennej nick, hasło do zmiennej haslo itd... Hasło i Email są szyfrowane przez md5. Gdy klikniemy "Wyślij", powinna nam się utworzyć tabela o nazwie nicku, a w niej powinny utworzyć się pola i wypełnić danymi z formularza.

Teraz drugie pytanie, jak szyfrować inne wartości, tak, żeby jak najciężej było je edytować hakerom i tym podobnym? Chciałbym coś w stylu md5, fajna rzecz ale pewnie łatwa do minięcia. Załóżmy, że każdy użytkownik dostawałby 5000 punktów do jakiegoś tam celu. Będzie miał możliwości zarobku, ale istnieją użytkownicy, którzy chcieliby w kilka minut mieć np. dodatkowe 10000 punktów. Nie interesowałem się jak można to zrobić, ale chyba użytkownicy tego forum wiedzą jak tego uniknąć, czyli co zastosować.</b></b>

0

MD5 nie da się rozkodować. Poza tym nie rozumiem za bardzo o co Ci chodzi z tymi punktami. Rozpisz to powoli i wyraźnie ;)
I jeszcze jedno: CHCESZ ROBIĆ TABELĘ NA JEDNEGO GRACZA ŻEBY ZAPISAĆ W NIEJ JEDEN REKORD?!

To tyle.

0
        //zapytanie dodające zmienne $imie i $nazwisko do bazy
        $zapytanie = "CREATE TABLE $nick (
        poziom VARCHAR(1),
        haslo VARCHAR(255),
        email VARCHAR(255),
        data VARCHAR(15),
        datazalogowania VARCHAR(15),
        nazwapanstwa VARCHAR(50),
        avatar VARCHAR(80),
        )
        INSERT INTO $nick VALUES ('$poziom','$haslopoprawne','$emailpoprawny','$data','$datazalogowania','$nazwapanstwa','$avatar')";

Takie cos nie jest dobrym rozwiazaniem.

  1. to nie powinno przejsc - chyba a od mysql 5 w gore mozna robic "wielozadaniowe query"
  2. zle podejscie do struktury tabeli - powinna byc ona zaprojektowana zgodnie z (co najmniej) trzecia postacia normalna, a tworzenie nowych tabel dla kazdego uzytkownika nie jest hmm "fajne"
0

Hm, hm. Więc tak. Gracz się rejestruje, na początek dostaje swoje 5000 punktów. Punkty to jakby waluta w grze. Są pewnie różne programy, robaki itp. które bez problemu zmienią tą liczbe na większą, włamując się na serwer... czy jak to tam się dzieje. Chcę temu zapobiec szyfrując za każdym razem w jakiś sposób tą liczbe. Czyli przy rejestracji - szyfrowanie. Kupuję coś za te punkty, są odejmowane i zostaje zaszyfrowane 4000 punktów.

Teraz z tą tabelą na jednego gracza - to miało być na próbę, nie wiem czy to w czymś przeszkodzi - 5000 tabel w jednej bazie Mysql :), jeżeli tak, to przebuduję z powrotem, ale czy tak czy inaczej, coś w tym kodzie jest nie tak. Gdy miałem zamiast

$zapytanie = "CREATE TABLE $nick (
        poziom VARCHAR(1),
        haslo VARCHAR(255),
        email VARCHAR(255),
        data VARCHAR(15),
        datazalogowania VARCHAR(15),
        nazwapanstwa VARCHAR(50),
        avatar VARCHAR(80),
        )";
        INSERT INTO $nick VALUES ('$poziom', '$haslo','$email','$data','$datazalogowania','$nazwapanstwa','$avatar')";

to:

$zapytanie = "INSERT INTO `jakasnazwabazy`.`users` (`nick` ,`poziom` ,`haslo` ,`email` ,`data` ,`datazalogowania` ,`nazwapanstwa` ,`avatar`) VALUES ('$nick', '$poziom', '$haslo', '$email', '$data', '$datazalogowania', '$nazwapanstwa', '$avatar')";

Też nie działało, oczywiście była dodana tabela "users" z tymi polami.

0

DaRkMAN: Cie porąbało... Jakie robaki? Postaw se na kompie Vallheru (wiem że zły przykład, ale ono tam ma tylko podstawowe zabezpieczenia) i spróbuj to zhaczyć i sobie ustawić 999999999$. Poza tym kodowanie symetryczne nie ma sensu, bo i tak będziesz musiał to odkodować. Jeśli dobrze napiszesz aplikację, to nikt Ci się do niej nie wbije.

0

No czytałem w jakiejś grze "robaki wykorzystujące błędy w grze", więc to się tyczy tego co ja źle skleje. Ale przecież zaawansowane strony mają różne zabezpieczenia itd, po co by to miały? Martwię się, bo ja wszystko robie po swojemu, czyli prosty kod, w niektórych miejscach melina, bez zabezpieczeń prócz kodowania sha1 na hasło. Chcę utworzyć w grze możliwość zamówienia konta Premium, abym mógł zarobić na dobry serwer, domene i reklame tej gry. Gdy gra coraz więcej osób to wiadomo, że trzeba w końcu przenieść się na płatny serwer, potem dokupić itd.. A chciałbym, żeby Premium w ogóle było sens zamawiać, bo może się okazać że nawet 5 latek może sobie znaleźć jakiś programik w internecie, dzięki któremu sobie dopisze troche punktów co jakiś czas.

0

Widać że totalną ciemnotą jesteś jeśli chodzi o programowanie...
Jak ma Ci się wbić jakimś programikiem do bazy? Ściągnij sobie źródła kojota i zobacz jakie on ma zabezpieczenia: SHA1[+MD5][+SALT] na hasło, anty XSS, anty SQLInject i tyle.

0

eełełe.. może raczej jeżeli chodzi o zabezpieczenia, bo w programowanie już sie dłuuugo bawie, ale php od niedawna, a o mysql ledwo mam pojęcie. A co jeśli na serwerze stoi zwykły plik txt z danymi?

0

To zazwyczaj można go odczytać znając ścieżkę, chyba że świadomie tego zabronisz.

0

O właśnie i po to mi to wszystko. :D Zrobiłem coś takiego - użytkownik sie rejestreuje i zostaje utworzony plik w Users o nazwie 578912s564da647sd + nick podany w rejestracji, czyli razem "578912s564da647sdDaRkMAN". Oczywiście ten ciąg znaków jest inny, podałem dla przykładów. Dodam jeszcze kilka mylnych danych w pliku typu: "premium=0", domyślam się, że każdy kto już dotrze do swojego pliku, to albo zmieni sobie same premium=0 na premium=1 albo i premium i inne wartości. Jeżeli premium będzie miało inną wartość niż 0 to hasło użytkownika ulega zmianie, tak samo jego nick na np. dousuniecia01, wtedy ja przeglądając baze danych moge spokojnie go usunąć. Co jeszcze można zrobić?

0

Jak może prostytutka mać zmieniać coś na nie swoim serwerze?! JAK?! JAAAAAK?!

0
DaRkMAN napisał(a)

nie wiem czy to w czymś przeszkodzi - 5000 tabel w jednej bazie Mysql :)...

5000 tabel czy rekordów ? Z tego co piszesz, wnioskuje, że chodzi Ci raczej o tabele - tylko zastanawiam się po co ? Geniuszem w sprawach php nie jestem, nie mniej jednak nie łatwiej, lepiej, estetyczniej etc etc (inne epitety) zrobić jedną tabelę i te prorocze 5000 rekordów ? ;]

0

Dobrze mówisz. Tylko tak to jest jak się zabiera za projekt, a nie zna języka ni w dechę.
Poza tym to że gdzieś o czymś tam przeczytałeś Darkmanie, mnie nie interesuje. Ja rozwiązałem już setki problemów na tym forum i swoje wiem.

0

No nie..... w takim razie ja moge napisać, że mnie nie interesuje ile problemów rozwiązałeś, bo nie chce mi się ich szukać wyszukiwarką. Sposób w jaki mi chciałeś "pomóc" nasuwa myśl, że 2 razy więcej twoich "prób pomocy" to były wypowiedzi właśnie takie jak te wyżej. Czyli nie pomagają, mogą tylko przeszkodzić w dążeniu do celu. Jakby co to przepraszam za te kilka słów, ale nie lubie gdy ktoś mnie zdenerwuje :D. Ale ok, znalazłem proste rozwiązanie dzięki któremu nikt nawet nie zajrzy do pliku. A co do rejestracji i tych 5000 tabel, już dawno z tego zrezygnowałem, pomysł byłby dobry, tylko raczej na forum wam nie wytłumacze dlaczego mi na tym zależało. Mogę napisać tylko, że łatwiej znaleźć i przeglądać 1 tabele użytkownika, niż szukać jednego wpisu wśród 5000 innych, do tego jeden wpis miałby ok. 40 pól? Zamiast tych tabel dobudowałem pliki txt, w MySQL będą dane do logowania (nick, hasło, email) w pliku txt dane dotyczące gry. A programowanie lubie tylko dlatego, że robie tak jak chce zrobić - to takie podsumowanie dlaczego robie tak, a nie inaczej. Dziękuję za odpowiedzi. Pozdrawiam.

0

Taka prawie losowa nazwa pliku nie jest 100% zabezpieczeniem.

0

Ok, przeniosłeś to dane do plików. Tylko pomyśl o optymalizacji, odczyt z pliku będzie chyba wolniejszy niżeli odczyt z MySQL. Zwłaszcza, że zamierzasz mieć tych plików ok 5000. Po to są właśnie bazy danych, żeby przechowywać w nich dane. Jeżeli baza ma być ogromna to trzeba ją dobrze zaprojektować, żeby działała sprawnie, jeżeli mysql Ci nie wystarcza -> przejdz na Oracle.

Btw. jeżeli dobrze zaprojektujesz bazę, to wyszukiwanie będzie o wiele szybsze niż znalezienie i odczyt z pliku + parasowanie tych danych.

Jednak jak zwykle napisze - super guru nie jestem, też w sumie uczę się php, jednak weź pod uwagę to co pisali poprzednicy (a zwłaszcza 3-cia postac normalną)

0

Nie wiem po co kombinujesz Darkman z tymi nazwami plików. Wrzucasz do folderu ze storage taki plik .htaccess:
deny from all
I masz problem odfajkowany, bo Apache nigdy Ci go nie udostępni. Ale po co udziwniasz z tym to nie wiem. Po prostu najlepsze zabezpieczenia to funkcje: addslashes(), stripslashes(), strip_tags(), is_numeric(), str_replace() stosowane we właściwych miejscach.

Więcej "ozdób" nie trzeba.

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