Jeśli jesteś właścicielem tej strony, możesz wyłączyć reklamę poniżej zmieniając pakiet na PRO lub VIP w panelu naszego hostingu już od 4zł!
Strony WWWSerwery VPSDomenyHostingDarmowy Hosting CBA.pl
System rejestracji i logowania - Laj.c0.pl
16
Lip
2010


Następny plik to register.php
Kod:
<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
  <form action="info.php?action=register" method="post">
    <fieldset class="register">
<div class="register"><label class="register" for="login">Nazwa użytkownika:</label>
<input id="login" name="login" type="text"/></div>
<div class="register"><label class="register" for="pass">Hasło:</label>
<input id="pass" class="form" type="password" name="pass"/></div>
<div class="register"><label class="register" for="pass1">PotwierdĽ hasło</label>
<input id="pass1"class="form" type="password" name="pass1"/></div>
<div class="register"><label class="register" for="mail">Adres e-mail:</label>
<input id="mail"class="form" type="text" name="mail"/></div>
<div class="register"><input class="wyslij" type="submit" value="Zarejestruj"/></div>
      </fieldset>
  </form>

<a href="index.php">Strona główna</a>
</body>
</html>

Czyli prosty formularz w HTML.
Do niego dochodzi plik login.php
Kod:
<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>


  <form action="info.php?action=login" method="post">
    <fieldset class="register">
        <div class="register"><label class="register" for="login">Nazwa użytkownika:</label>
<input id="login" name="login" type="text"/></div>
<div class="register"><label class="register" for="pass">Hasło:</label>
<input id="pass" type="password" name="pass"/></div>
<div class="register"><input class="wyslij" type="submit" value="Zaloguj"/></div>
    </fieldset>
  </form>

<a href="index.php">Strona główna</a>
</body>
</html>

Czyli podobnie wyglądający formularz. Jak można zauważyć formularze w obu powyższych plikach kierują nas do pliku info.php który sterowany będzie przez zmienną:
Kod:$_GET['action']

Jest to jedyny plik z bardziej skomplikowaną zawartością.
Kod:
<?php
session_start(); //wklejamy w nagłowku każdej strony

require 'db_config.php';                 //Załadowanie pliku z konfiguracją
connection(); //Połączenie z bazą

switch($_GET['action']){
case 'login': //Jeżeli użytkownik loguje się
  $pass=md5($_POST['pass']);                         //hashujemy hasło
  $login=mysql_real_escape_string($_POST['login']);
                                      //Tutaj możemy wkleić funckje zwiększające bezpieczeństwo

  $sql=mysql_num_rows(mysql_query('SELECT * FROM `'.PREF.'users` WHERE `login`="'.$login.'" AND `pass`="'.$pass.'" LIMIT 1'));
 
  if ($sql == 0) {               
  echo "Przepraszamy, nie udało się zalogować";
    }else { 
    echo "Witaj $login, zostałeś zalogowany";
  $_SESSION['zalogowany']=1;
  $_SESSION['nick']=$login;
  }
 
 
  break;
  case 'register':       //Jeżeli użytkownik się rejestruje
  $login=mysql_real_escape_string($_POST['login']);  //Pobieranie danych
  $pass=$_POST['pass'];
  $pass1=$_POST['pass1'];
  $mail=mysql_real_escape_string($_POST['mail']);
  if($pass==$pass1)     //Sprawdzanie haseł
  $pass=md5($pass);     //Jeśli są takie same następuje haszowanie jednego z nich
                                        //Tutaj możemy wkleić funckje zwiększające bezpieczeństwo

    $sql=mysql_query('INSERT INTO `'.PREF.'users` (`id`, `login`, `pass`, `mail`)
    VALUES (NULL, "'.$login.'", "'.$pass.'", "'.$mail.'");');
   
    echo'Zostałeś zarejestrowany';   
    break;     //Skrypt nie sprawdza czy użytkownik na 100% został zarejestrowany
   
  case 'logout':
  session_destroy();     //Zniszczenie sesji powoduje utratę zmiennej zawierającej info o tym że nasz
                                    //użytkownik jest zalogowany oraz jego loginu
  echo'Zostałeś wylogowany';  //Co skutkuje wylogowaniem go z serwisu
  break;
}

  echo'<br /><a href="index.php">Powrót na stronę główną</a>';
mysql_close();                      //Kończymy połączenie z bazą danych
?>


Plik dzieli się na trzy części. Pomaga nam w tym instrukcja switch wykonująca dany zakres operacji w zależności od wartości zmiennej. Pamiętajmy że wprowadzone do bazy danych hasła należy kodować algorytmami md5 lub sha1. Istnieje na to kilka sposobów.
Kod:
$haslo=md5($haslo);    //Najprostszy sposób
$haslo=sha1($haslo);  //Drugi z prostych sposobów
$haslo = md5(sha1($haslo));  //Najlepsze zakodowanie hasła

Teoretycznie algorytmów tych nie mozna "odwócić", czyli zakodowaanyh(a dokładniej zahaszowanych) haseł nie da się już rozkodować, jednak jak dobrze wiemy nie ma zabezpieczeń nie do obejścia.

Do tego dochodzi jeszcze jedno zabezpieczenie, uniemozliwiające dokonanie ataku SQLInjection polegającym na wprowadzeniu dodatkowego zapytania do bazy danych które może spowodować zmianę lub utratę zawartości bazy danych.
Jest nim funkcja
Kod:
mysql_real_escape_string($zmienna);

Warto również wykorzystać dwie dodatkowe funkcje:
Kod:
htmlspecialchars($zmienna);  Zamienia znaczniki html(które mogą rozwalić nams stronę) na encje
addslashes($zmienna);  Zamienia znaki ',", na ',",\

Druga z wklejonych funkcji dodaje dodatkowy ukośnik wsteczny do znaków które mogą nam zniszczyć bazę danych. O ile nie istnieje funkcja odwrotna do pierwszej, tutaj można użyć np. wyrażeń regularnych(całkiem inny temat); o tyle druga z funkcji ma swoją odwrotność.
Kod:
stripslashes($zmienna)  //Usuwa zbędne ukośniki


Dobrze, zboczyłem już lekko z tematu wpisu więc nie ma sensu kontynuować dalszych wywodów nt. bezpieczeństwa itp. poniewać można o tym pisać dziesiątki artykułów nie wyczerpując w pełni tematu.

Podsumowując:
-5 plików
-Tabela w bazie danych
I mamy prosty mechanizm rejestracji użytkowników. Mam nadzieję że na coś się on komuś kiedyś przyda :Dcenter>Strony:<< 1 2 >>

Następny plik to register.php
Kod:
<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
  <form action="info.php?action=register" method="post">
    <fieldset class="register">
<div class="register"><label class="register" for="login">Nazwa użytkownika:</label>
<input id="login" name="login" type="text"/></div>
<div class="register"><label class="register" for="pass">Hasło:</label>
<input id="pass" class="form" type="password" name="pass"/></div>
<div class="register"><label class="register" for="pass1">PotwierdĽ hasło</label>
<input id="pass1"class="form" type="password" name="pass1"/></div>
<div class="register"><label class="register" for="mail">Adres e-mail:</label>
<input id="mail"class="form" type="text" name="mail"/></div>
<div class="register"><input class="wyslij" type="submit" value="Zarejestruj"/></div>
      </fieldset>
  </form>

<a href="index.php">Strona główna</a>
</body>
</html>

Czyli prosty formularz w HTML.
Do niego dochodzi plik login.php
Kod:
<html>
<head>
<link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>


  <form action="info.php?action=login" method="post">
    <fieldset class="register">
        <div class="register"><label class="register" for="login">Nazwa użytkownika:</label>
<input id="login" name="login" type="text"/></div>
<div class="register"><label class="register" for="pass">Hasło:</label>
<input id="pass" type="password" name="pass"/></div>
<div class="register"><input class="wyslij" type="submit" value="Zaloguj"/></div>
    </fieldset>
  </form>

<a href="index.php">Strona główna</a>
</body>
</html>

Czyli podobnie wyglądający formularz. Jak można zauważyć formularze w obu powyższych plikach kierują nas do pliku info.php który sterowany będzie przez zmienną:
Kod:$_GET['action']

Jest to jedyny plik z bardziej skomplikowaną zawartością.
Kod:
<?php
session_start(); //wklejamy w nagłowku każdej strony

require 'db_config.php';                 //Załadowanie pliku z konfiguracją
connection(); //Połączenie z bazą

switch($_GET['action']){
case 'login': //Jeżeli użytkownik loguje się
  $pass=md5($_POST['pass']);                         //hashujemy hasło
  $login=mysql_real_escape_string($_POST['login']);
                                      //Tutaj możemy wkleić funckje zwiększające bezpieczeństwo

  $sql=mysql_num_rows(mysql_query('SELECT * FROM `'.PREF.'users` WHERE `login`="'.$login.'" AND `pass`="'.$pass.'" LIMIT 1'));
 
  if ($sql == 0) {               
  echo "Przepraszamy, nie udało się zalogować";
    }else { 
    echo "Witaj $login, zostałeś zalogowany";
  $_SESSION['zalogowany']=1;
  $_SESSION['nick']=$login;
  }
 
 
  break;
  case 'register':       //Jeżeli użytkownik się rejestruje
  $login=mysql_real_escape_string($_POST['login']);  //Pobieranie danych
  $pass=$_POST['pass'];
  $pass1=$_POST['pass1'];
  $mail=mysql_real_escape_string($_POST['mail']);
  if($pass==$pass1)     //Sprawdzanie haseł
  $pass=md5($pass);     //Jeśli są takie same następuje haszowanie jednego z nich
                                        //Tutaj możemy wkleić funckje zwiększające bezpieczeństwo

    $sql=mysql_query('INSERT INTO `'.PREF.'users` (`id`, `login`, `pass`, `mail`)
    VALUES (NULL, "'.$login.'", "'.$pass.'", "'.$mail.'");');
   
    echo'Zostałeś zarejestrowany';   
    break;     //Skrypt nie sprawdza czy użytkownik na 100% został zarejestrowany
   
  case 'logout':
  session_destroy();     //Zniszczenie sesji powoduje utratę zmiennej zawierającej info o tym że nasz
                                    //użytkownik jest zalogowany oraz jego loginu
  echo'Zostałeś wylogowany';  //Co skutkuje wylogowaniem go z serwisu
  break;
}

  echo'<br /><a href="index.php">Powrót na stronę główną</a>';
mysql_close();                      //Kończymy połączenie z bazą danych
?>


Plik dzieli się na trzy części. Pomaga nam w tym instrukcja switch wykonująca dany zakres operacji w zależności od wartości zmiennej. Pamiętajmy że wprowadzone do bazy danych hasła należy kodować algorytmami md5 lub sha1. Istnieje na to kilka sposobów.
Kod:
$haslo=md5($haslo);    //Najprostszy sposób
$haslo=sha1($haslo);  //Drugi z prostych sposobów
$haslo = md5(sha1($haslo));  //Najlepsze zakodowanie hasła

Teoretycznie algorytmów tych nie mozna "odwócić", czyli zakodowaanyh(a dokładniej zahaszowanych) haseł nie da się już rozkodować, jednak jak dobrze wiemy nie ma zabezpieczeń nie do obejścia.

Do tego dochodzi jeszcze jedno zabezpieczenie, uniemozliwiające dokonanie ataku SQLInjection polegającym na wprowadzeniu dodatkowego zapytania do bazy danych które może spowodować zmianę lub utratę zawartości bazy danych.
Jest nim funkcja
Kod:
mysql_real_escape_string($zmienna);

Warto również wykorzystać dwie dodatkowe funkcje:
Kod:
htmlspecialchars($zmienna);  Zamienia znaczniki html(które mogą rozwalić nams stronę) na encje
addslashes($zmienna);  Zamienia znaki ',", na ',",\

Druga z wklejonych funkcji dodaje dodatkowy ukośnik wsteczny do znaków które mogą nam zniszczyć bazę danych. O ile nie istnieje funkcja odwrotna do pierwszej, tutaj można użyć np. wyrażeń regularnych(całkiem inny temat); o tyle druga z funkcji ma swoją odwrotność.
Kod:
stripslashes($zmienna)  //Usuwa zbędne ukośniki


Dobrze, zboczyłem już lekko z tematu wpisu więc nie ma sensu kontynuować dalszych wywodów nt. bezpieczeństwa itp. poniewać można o tym pisać dziesiątki artykułów nie wyczerpując w pełni tematu.

Podsumowując:
-5 plików
-Tabela w bazie danych
I mamy prosty mechanizm rejestracji użytkowników. Mam nadzieję że na coś się on komuś kiedyś przyda :D
Strony:<< 1 2 >>

Nick:

Pytanie kontrolne: Nazwisko Roberta Kubicy?

Komentarz:


22 lip 2010 18:33:33
Co do bezpieczeństwa - kod ma być prosty i co najwyżej odporny na jakieś dzieci neo i h4k3rów. O jakie luki Ci chodzi?Opisane jest jak dodać podstawową ochronę przed najważniejszymi zagrożeniami, czyli XSS i SQLInjection.
A jeśli chodzi o zmienne to faktycznie, lepiej jest wykorzystać nick i hasło(zahaszowane), tyle że ten kod jest stary, obrałem go tylko ze zbędnej zawartości i wkleiłem.
Laj
22 lip 2010 13:24:13
Laj, twój skrypt zawiera dość sporo luk w bezpieczeństwie. Nie rozumiem po co użyłeś zmiennych sesyjnych zalogowany i nick, dużo lepiej jest zrobić nick i hasło, a potem sprawdzać.

Pozdro!
Dziećka

Udostępnij na Facebooku Udostępnij na Twitterze