Silnik zabezpieczający stronę hasłem

muzaMen

Silnik ochrony strony

Ten skrypt przyda się osobom które nie mają ochoty pisać własnego silnika zabezpieczeń.
Posiada on trzy funkcje: Zaloguj/Wyloguj i Sprawdź uprawnienia. Funkcja o nazwie:
securityCheckAuth - Sprawdza czy user jest zalogowany i czy ma wymagany poziom autoryzacji. Zwraca TRUE lub FALSE.
securityLoginUser - Loguje usera do systemu. W parametrach należy podać login i hasło podane w formularzu logowania przez użytkownika. Przykład wywołania funkcji: securityLoginUser($_POST['login'], $_POST['password']);. Jeśli użytkownik zostanie zalogowany do systemu, funkcja zwróci TRUE. Jeśli hasło jest nieprawidłowe lub nie ma takiego użytkownika funkcja odda wynik FALSE.
securityLogoutUser - Wylogowywuje usera i zawsze zwraca TRUE.
securityGetUsername - Zwraca nazwę użytkownika lub pustą odpowiedź jeśli nie jest on zalogowany
securityGetPasswd - Zwraca hasło użytkownika lub pustą odpowiedź jeśli nie jest on zalogowany
Teraz wylistuję pliki za pomocą których zbudujemy silnik.

Stwórzmy folder SecurityEngine, a w nim plik: engine.php. W jego treści wpiszmy:

<?php
/*

Security Engine v.1.0 by Demonical Monk
Date: 29.08.2008
Created for: 4programmers.net
License: GNU General Public License
http://www.gnu.org/copyleft/gpl.html

*/

//Startujemy sesję
session_start();

//Sprawdzanie czy user ma odpowiedni poziom dostępu
//---
//$REQ - Wymagany poziom autoryzacji
function securityCheckAuth($req) {
session_start(); //Jeszcze raz sesja żeby było śmiesznie :P
  if ($_SESSION['logged'] == '1') {
    if ($_SESSION['userdata']['access'] < $req) {
      return(false);
    }
  return(true);
  }
return(false);
}

//Logowanie usera
//---
//$LOGIN - Login podany przez usera
//$PASSWORD - Hasło podane przez usera

//TRUE - Zalogowano poprawnie
//FALSE - Błąd logowania (zły login lub hasło)
function securityLoginUser($login, $password) {
session_start(); //To jeszcze tu sesja
$inSecurityEngine = TRUE; //Odblokowywanie zabezpieczenia
 include('users.php');
  for ($i=0; $i<count($users); $i++) {
    if ($users[$i]['uname'] == $login) {
      if ($users[$i]['password'] != $password) {
        return(false);
      }
        $_SESSION['logged'] = 1;
        $_SESSION['userdata']['uname'] = $login;
        $_SESSION['userdata']['password'] = $password;
        $_SESSION['userdata']['access'] = $users[$i]['access'];
        return(true);
    }
  }
  return(false);
}

//Wylogowywanie usera
function securityLogoutUser() {
session_start(); //Do tego też
  $_SESSION['logged'] = 0;
  return(true);
}

//Pobieranie nazwy usera
//Zwraca login lub pusta odpowiedz jesli user nie jest zalogowany
function securityGetUsername() {
session_start();
 if ($_SESSION['logged'] == 0) {
  return('');
 } else {
  return($_SESSION['userdata']['uname']);
 }
}

//Pobieranie hasla usera
//Zwraca haslo lub pusta odpowiedz jesli user nie jest zalogowany
function securityGetPasswd() {
session_start();
 if ($_SESSION['logged'] == 0) {
  return('');
 } else {
  return($_SESSION['userdata']['password']);
 }
}
?>

Teraz wystarczy utworzyć plik users.php w którym przechowamy dane naszych userów.
Przykładowa zawartość:

<?php
/*

Security Engine v.1.0 by Demonical Monk
Date: 29.08.2008
Created for: 4programmers.net
License: GNU General Public License
http://www.gnu.org/copyleft/gpl.html

*/

//Zabezpieczenie
if ($inSecurityEngine != TRUE) {
echo('n00B Hax0R');
exit;
}

//Spis użytkowników
$users = array();

$users[0]['uname'] = 'Admin';
$users[0]['password'] = 'asd123';
$users[0]['access'] = '10';

$users[1]['uname'] = 'Userek1';
$users[1]['password'] = 'test';
$users[1]['access'] = '2';

$users[2]['uname'] = 'Moderator2';
$users[2]['password'] = 'szukamZasiegu';
$users[2]['access'] = '6';
?>

Ten plik można zmodyfikować dowolnie, nawet podłączyć do MySQL byle dane zostały wypuszczone w takim formacie w jakim są tu przedstawione. No to teraz wyjaśnię obsługę powyższego skryptu. Na początku strony którą chcemy ochronić wpisujemy na początku:

<?php
include('SecurityEngine/engine.php');
$result = securityCheckAuth('3'); //Żeby user dostał się do tej strony, musi mieć ustawiony access na minimalnie 3.
if ($result == FALSE) {
die('Nie masz wystarczajacych uprawnien do ogladania tej strony lub nie jestes zalogowany.');
}
?>

<!-- Dalej normalnie podajemy źródło strony -->

W ten sposób użytkownicy niezalogowani lub użytkownicy o prawach dostępu 0, 1 lub 2 nie będą mogli dostać się do tej strony. Żeby zalogować samego użytkownika do tego systemu wystarczy wywołać funkcję securityLoginUser(LOGIN, HASŁO) która w przypadku błędu zwróci FALSE lub w przypadku podania prawidłowego loginu i hasła zaloguje użytkownika do systemu i zwróci true.

19 komentarzy

A kto mi powie po co jest zmienna $inSecurityEngine??

No to podglądaj kod PHP -_- Ten system jest do d[...]! Za kilka dni naskrobie coś co będzie na prawdę bezpieczne.

Z tego, co widzę jest to całkiem dobry sposób na zabezpieczenie części serwisu. Czegoś takiego szukałem, jednak każdy kto się nieco zna, może podejżeć kod źródłowy takiej strony i zobaczyć prawidłowe hasło.

wszystko fajno tylko u 20% populacji przy zastosowaniu tegoz skryptu sesja jakos sie nie chce zapamietac - przy kazdym wejsciu na zabezpieczoną podstronę wywala na podaj hasło a jak wpisze haslo to wywala na glowna.. jakies pomysly?? najlepiej pisac na GG:2928054

hehe, z Waszego forum juz sie dowiedziałem ze skrypt przestarzały i dziwne ze jeszcze chodzi :P

nie da się wymusić https, możesz tylko w action podać https://twoj.serwer:port_serwera_https/nazwa.pliku.php
inaczej nie da rady, bo z tego co wiem to nie ma jakiegoś sandardu co do numeru portu https, i to chyba jeden z elementów zabezpieczenia jest :)

Machnąłem się i zapomniałem w pliku users.php dodać:

//Zabezpieczenie
if ($inSecurityEngine != TRUE) {
echo('n00B Hax0R');
exit;
}

Dominium: Bo tak się zabezpiecza?

czy ktos wie jak wymusic https przez php?

Wszystko piekne, ale nie widze zbyt wielu powodow dla ktorych to mialoby bezpieczniejsze od systemu w wersji 1. Wg mnie jest mniej bezpieczne:
a) Haslo nadal mozna przechwycic za pierwszym razem. Mozna sie przed tym zabezpieczyc poprzez zastosowanie HTTPS, ale wtedy wersja 1. tez staje sie bezpieczna.
b) Pojawila sie potencjalna nowa furtka, przez ktora mozna wejsc: dziurawy jak sito domyslny mechanizm obslugi sesji w PHP. Session id jest latwiej wykrasc niz haslo. Do hasla jest potrzebny sniffer, do session id wystarczy blad w skrypcie innego uzytkownika na tym samym serwerze.

Croolik... Ten system nie jest przeznaczony do zabezpieczania jakis danych a'la top secret, tylko do zwyklego, amatorskiego uzytku. Https to juz nieco wyzsza szkola jazdy, a wykradanie session_id i snifowanie sasiadow to tez raczej rzadkosc w przypadku malo pozadanych danych, chociaz istnieje taka mozliwosc... Dlatego zawsze gdy ktos sie o swoje dane mniej lub bardziej martwi to moze mnie (co juz sie zdazalo) poprosic o male usprawnienie kodu, albo sam to zrobic.

Gdyby komuś wyżej wymieniony kod nie działał, po session start proponuję dodać :
if (isset(@$_SESSION['haslo'])) {$haslo=@$_SESSION['haslo'];}
else { $haslo=@$_POST['haslo'];}

a session_register zamienić na
$_SESSION['haslo']=$_POST['haslo'];

i jeszcze:
if($action=='wyloguj')
na
if(@$_GET['action']=='wyloguj')

u mnie taka wersja zadziałała.

Gdy piszesz artykuł bierzesz kod php w znaczniki &ltphp> i po zapisaniu art zachwyca Cię kolorami

E, a jak wy to robicie, że kod PHP jest pokolorwany (nie chodzi mi o showsource)?

AdaŚ to do malego chlopca! ]:->

Okej, poprawiłem już to. Widze, że teraz artykuł jest o wiele bardziej przejrzysty. Dzięki Adaś...

wlasnie szukalem znacznikow w serwisie, ale nie znalazlem moze mi je podac?

Polecam branie kodu PHP w znaczniki <php> - nie dosc, ze koloruje kod PHP to jescze nie bierze pod uwage znacznikow HTML, wiec nie trzeba sie martwic o to, ze nie wyswietli potrzebnych tagow.

Sorry... Cenzuruje to: Dziękuje szanowny Adamie. Moze byc?

Matrix - czy sugerujesz, że Adam to jakiś dziadek chodzący o lasce? ;) [soczek]