No a teraz moja wersja, miałem trochę czasu.
Usprawniłem przy okazji trochę kod. Mam nadzieję, że nie popełniłem nigdzie błędów. U mnie działa z wyłączonym REGISTER GLOBALS.
Logowanie.php3
<?PHP
$OK = false;
session_set_cookie_params(2592000); // 60*60*24*30 sekund
session_start();
if(!isset($_SESSION['login'])){
if(isset($_SERVER['PHP_AUTH_USER'])){
$login = addslashes($_SERVER['PHP_AUTH_USER']);
$haslo = addslashes($_SERVER['PHP_AUTH_PW']);
$plik = fopen('users.dat', 'r');
if($plik){
flock($plik, LOCK_SH);
while(!feof($plik) and !$OK){
$linia = fgets($plik, 255);
$dane = explode(',', $linia);
if($dane[0] == $login){ // Optymalizacja szybkości
if($dane[1] == $haslo){
$OK = true; // Zakończenie pętli
$user = $dane[0];
}
}
}
flock($plik, LOCK_UN);
fclose($plik);
} else echo 'Brak uchwytu do pliku.';
}
} else {
$user = $_SESSION['login'];
$OK = true;
}
if($OK){
$_SESSION['login'] = $user;
} else {
header('WWW-Authenticate: Basic realm="Dostęp dla użytkownika"');
header('HTTP/1.0 401 Unauthorized');
session_destroy(); // Przydatne w przypadku złego zalogowania
echo 'Brak dostępu.';
exit;
}
// Do tego miejsca skrypt już nie dochodzi w przypadku braku dostępu
?>
<HTML>
<BODY>
<H2><?PHP echo "Witamy użytkownika $user!"; ?></H2>
<A HREF="wyloguj.php3">Wyloguj!</A>
</BODY>
</HTML>
Rejestracja.php3
<?PHP
$OK = false;
session_set_cookie_params(2592000); // 60*60*24*30 sekund
session_start();
if(!isset($_SESSION['login'])){
if(isset($_SERVER['PHP_AUTH_USER'])){
if($_SERVER['PHP_AUTH_USER'] == 'admin' and $_SERVER['PHP_AUTH_PW'] == '90210'){
$_SESSION['login'] = 'admin';
$OK = true;
}
}
} else {
if($_SESSION['login'] == 'admin'){
$OK = true;
}
}
if(!$OK){
header('WWW-Authenticate: Basic realm="Dostęp dla admina"');
header('HTTP/1.0 401 Unauthorized');
session_destroy(); // Przydatne w przypadku złego zalogowania
echo 'Brak dostępu.';
exit;
}
// Do tego miejsca skrypt już nie dochodzi w przypadku braku dostępu
$OK = false;
if(!empty($_POST['fLogin']) and !empty($_POST['fHaslo'])){
$login = addslashes($_POST['fLogin']);
$haslo = addslashes($_POST['fHaslo']);
if(file_exists('users.dat')){ // W przypadku braku pliku zostanie on utworzony, zabezpieczenie od wyświętlania błędów
$plik = fopen('users.dat', 'r'); // Prawo tylko do odczytu
if($plik){
flock($plik, LOCK_SH);
while(!feof($plik) and !$OK){
$linia = fgets($plik, 255);
$dane = explode(',', $linia);
if($dane[0] == $login){ // Sprawdzanie tylko loginu!
$user = $dane[0];
$OK = true; // Zakończenie pętli
}
}
flock($plik, LOCK_UN);
fclose($plik);
} else echo 'Brak uchwytu do pliku.';
}
if(!$OK){
$plik = fopen('users.dat', 'a'); // Prawo tylko do dopisywania
flock($plik, LOCK_EX);
$linia = $login.','.$haslo.",\r\n"; // Format - "login,haslo,(koniec linii)"
fwrite($plik, $linia);
$OK = true;
flock($plik, LOCK_UN);
} else $OK = false;
}
?>
<HTML>
<BODY>
<?PHP
if($OK){
echo "Zarejestrowano użytkownika \"$login\"";
} else {
if(isset($user)){
echo "Login \"$user\" jest już zajęty!";
}
}
?>
<HR><BR>
<CENTER><H1>Rejestracja</H1></CENTER>
<BR><BR><BR>
<FORM ACTION="rejestracja.php5" METHOD="POSt">
<TABLE ALIGN="CENTER" CELlSPACING="15">
<TR>
<TH>Login:</TH>
<TD><INPUT TYPE="text" NAME="fLogin"></TD>
</TR>
<TR>
<TH>Hasło:</TH>
<TD><INPUT TYPE="password" NAME="fHaslo"></TD>
</TR>
<TR>
<TD><INPUT TYPE="reset" VALUE="Wyczyść"></TD>
<TD><INPUT TYPE="submit" VALUE="Dodaj"></TD>
</TR>
</TABLE>
</FORM>
<A HREF="wyloguj.php3">Wyloguj!</A>
</BODY>
</HTML>
Wyloguj.php3
<?PHP
session_start();
$_SESSION = array();
session_destroy();
if(isset($_COOKIE[session_name()])){
setcookie(session_name(), '', -13000);
}
echo 'Zostałeś wylogowany!';
?>
Acha. Opcja "Wyloguj" może nie działać do następnego uruchomienia przeglądarki, ze względu na wykorzystanie systemu "Authorization".