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.

Przykład użycia silnika:
http://to.o12.pl/work/4programmers/ID_294/
Source plików z przykładu:
http://to.o12.pl/work/4programmers/ID_294/source.php

Kategoria: PHP

19 komentarzy

Avatar: Dominium
Napisany 2008-08-29 22:31 przez Dominium

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

Avatar: Demonical Monk
Napisany 2008-08-27 14:54 przez Demonical Monk

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

Brak avatara
Napisany 2008-01-05 13:25 przez apple13

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.

Avatar: dzek69
Napisany 2006-12-24 12:57 przez dzek69

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

Avatar: dzek69
Napisany 2007-12-20 19:06 przez dzek69

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

Brak avatara
Napisany 2006-01-03 02:59 przez nul

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 :)

Avatar: Demonical Monk
Napisany 2008-09-02 15:47 przez Demonical Monk

Machnąłem się i zapomniałem w pliku users.php dodać:
//Zabezpieczenie
if ($inSecurityEngine != TRUE) {
echo('n00B Hax0R');
exit;
}

Dominium: Bo tak się zabezpiecza?

Brak avatara
Napisany 2005-02-02 17:35 przez darek-linux

czy ktos wie jak wymusic https przez php?

Brak avatara
Napisany 2004-04-05 12:26 przez croolik

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.

Avatar: muzaMen
Napisany 2004-06-19 18:20 przez muzaMen

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.

Avatar: Numi
Napisany 2003-10-04 13:46 przez Numi

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.

Avatar: muzaMen
Napisany 2003-10-01 16:56 przez muzaMen

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

Brak avatara
Napisany 2003-09-15 18:09 przez rzexnik

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

Avatar: Matrix(orginal)
Napisany 2003-07-29 23:20 przez Matrix(orginal)

AdaŚ to do malego chlopca! ]:->

Avatar: muzaMen
Napisany 2003-07-28 12:18 przez muzaMen

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

Avatar: muzaMen
Napisany 2003-07-28 12:00 przez muzaMen

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

Brak avatara
Napisany 2003-07-28 11:10 przez Adam Boduch

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.

Avatar: muzaMen
Napisany 2003-07-30 13:57 przez muzaMen

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

Avatar: Marooned
Napisany 2003-07-30 19:11 przez Marooned

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

4programmers.net