Silnik zabezpieczający stronę hasłem
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']);
}
}
?>
/*
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';
?>
/*
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 -->
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



if ($inSecurityEngine != TRUE) {
echo('n00B Hax0R');
exit;
}
Dominium: Bo tak się zabezpiecza?
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
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.
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.