Prosty skrypt logowania
Witam!
Chciałbym wam przedstawić sposób logowania w PHP zrobiony przeze mnie. Skrypt odczytuje zaszyfrowane hasło z pliku, i loguje z wykorzystaniem sesji.
Niektórzy może nie wiedzą, jak szyfrować tekst. Oto funkcja szyfrująca:
- tekst_do_zaszyfrowania: tekst, który funkcja zaszyfruje
- klucz_szyfrowania: dwucyfrowy klucz do zaszyfrowania (lub argument $salt)
Oto cały (jakże prosty) kod szyfrowania hasła:
Pewnie myślicie, że logowanie będzie trudne (z poziomu pisania skryptu). To tylko złudzenie. Objasnię każdą komendę.
I co, trudne? A teraz formularz, gdzie użytkownikl wprowadza nazwę usera i hasło:
<form action="login.php" method="post">
<table border="0">
<tr>
<td>Login</td><td><input type="text" name="user" size="15"></td>
</tr>
<tr>
<td>Hasło</td><td><input type="password" name="pass" size="15"></td>
</tr>
</table>
<input type="submit" value="Zaloguj"><br>
<font color="red">UWAGA!</font><br>
System rozróżnia małe i duże litery w loginie i haśle, a zatem, jeżeli w polu "Login" wpiszesz<br>
<b>adamo</b>, to nie będzie to to samo co <b>aDAmo</b>!!
</form>
Chciałbym wam przedstawić sposób logowania w PHP zrobiony przeze mnie. Skrypt odczytuje zaszyfrowane hasło z pliku, i loguje z wykorzystaniem sesji.
Szyfrowanie
Niektórzy może nie wiedzą, jak szyfrować tekst. Oto funkcja szyfrująca:
- tekst_do_zaszyfrowania: tekst, który funkcja zaszyfruje
- klucz_szyfrowania: dwucyfrowy klucz do zaszyfrowania (lub argument $salt)
Oto cały (jakże prosty) kod szyfrowania hasła:
<?php
$haslo=$_POST["opsops"];
$zhaslo=crypt($haslo, 12);
?>
<form action="crypt.php" method="POST">
Hasło do zaszyfrowania: <input type="password" name="haslo" size=8><br>
<input type="submit" value="Szyfruj">
</form>
$haslo=$_POST["opsops"];
$zhaslo=crypt($haslo, 12);
?>
<form action="crypt.php" method="POST">
Hasło do zaszyfrowania: <input type="password" name="haslo" size=8><br>
<input type="submit" value="Szyfruj">
</form>
Logowanie
Pewnie myślicie, że logowanie będzie trudne (z poziomu pisania skryptu). To tylko złudzenie. Objasnię każdą komendę.
<?
session_start(); //rozpoczęcie sesji
$login=$_POST['user']; //odczytuje login z formularza
$has=crypt($_POST['pass'], 12); //szyfruje hasło
if(file_exists($login.'.pass')){ //jeżeli plik $login.pass istnieje...
$phaslo=$login.'.pass'; //przypisuje zmiennej phaslo nazwę pliku z hasłem
$haslo=fread(fopen($phaslo, "r"), filesize($phaslo)); /odczytuje hasło z pliku (chmod 666)
$ile=fread(fopen($login.'.ile', "r"), filesize($login.'.ile')); //odczytuje ilość logowań (chmod 666)
$ile = $ile+1; //dodaje 1 do $ile
fwrite(fopen($login.'.ile', "w"), $ile); //zapisuje zmienną $file do pliku z ilością logowań
$logi=fread(fopen("log.log", "r"), filesize("log.log")); //odczytuje logi ogólne
$logi .='
'.date("d-m-Y H:i").' - logowanie użytkownika '.$login; /* dopisuje do zmiennej $logi logowanie użytkownika */
fwrite(fopen("log.log", "w"), $logi); //zapisuje $logi do pliku log.log (chmod 666)
}
else{ //jeżeli nie ma pliku $login.pass...
echo('Użytkownik nie istnieje<br>'); //... wyświetla napis
}
if($has == $haslo){ /* jeżeli hasło wprowadzone przez użytkownika zgadza się z tym z pliku... */
$_SESSION['user']=$_POST['user']; /* zapisuje do zmiennej sesji $user nazwę wprowadzoną przez usera */
$_SESSION['pass']=$_POST['pass']; /* jw. tylko zapisuje hasło do zmiennej $pass */
echo('Użytkownik <b>'.$login.'</b> został zalogowany.<br>'); //Wyswietla napis
echo('Sesja '.$session_id.' rozpoczęta.<br>');//Wyświetla ID sesji
echo('Logowałeś/aś się <b>'.$ile.'</b> razy<br>'); //Wyświetla ilość logowań
echo('<a href="http://www.smiechy.cba.pl/">Strona główna</a><br>'); /* Wyświetla link na stronę główną */
echo('W razie problemów z logowaniem, <a href="http://www.smiechy.cba.pl/kontakt.php?def=15">napisz do administracji strony</a>'); /* Wyświetla link kontaktowy */
}
else //Jeżeli haso się nie zgadza...
Echo('Złe hasło'); //Wyświetla napis
?>// koniec skryptu
session_start(); //rozpoczęcie sesji
$login=$_POST['user']; //odczytuje login z formularza
$has=crypt($_POST['pass'], 12); //szyfruje hasło
if(file_exists($login.'.pass')){ //jeżeli plik $login.pass istnieje...
$phaslo=$login.'.pass'; //przypisuje zmiennej phaslo nazwę pliku z hasłem
$haslo=fread(fopen($phaslo, "r"), filesize($phaslo)); /odczytuje hasło z pliku (chmod 666)
$ile=fread(fopen($login.'.ile', "r"), filesize($login.'.ile')); //odczytuje ilość logowań (chmod 666)
$ile = $ile+1; //dodaje 1 do $ile
fwrite(fopen($login.'.ile', "w"), $ile); //zapisuje zmienną $file do pliku z ilością logowań
$logi=fread(fopen("log.log", "r"), filesize("log.log")); //odczytuje logi ogólne
$logi .='
'.date("d-m-Y H:i").' - logowanie użytkownika '.$login; /* dopisuje do zmiennej $logi logowanie użytkownika */
fwrite(fopen("log.log", "w"), $logi); //zapisuje $logi do pliku log.log (chmod 666)
}
else{ //jeżeli nie ma pliku $login.pass...
echo('Użytkownik nie istnieje<br>'); //... wyświetla napis
}
if($has == $haslo){ /* jeżeli hasło wprowadzone przez użytkownika zgadza się z tym z pliku... */
$_SESSION['user']=$_POST['user']; /* zapisuje do zmiennej sesji $user nazwę wprowadzoną przez usera */
$_SESSION['pass']=$_POST['pass']; /* jw. tylko zapisuje hasło do zmiennej $pass */
echo('Użytkownik <b>'.$login.'</b> został zalogowany.<br>'); //Wyswietla napis
echo('Sesja '.$session_id.' rozpoczęta.<br>');//Wyświetla ID sesji
echo('Logowałeś/aś się <b>'.$ile.'</b> razy<br>'); //Wyświetla ilość logowań
echo('<a href="http://www.smiechy.cba.pl/">Strona główna</a><br>'); /* Wyświetla link na stronę główną */
echo('W razie problemów z logowaniem, <a href="http://www.smiechy.cba.pl/kontakt.php?def=15">napisz do administracji strony</a>'); /* Wyświetla link kontaktowy */
}
else //Jeżeli haso się nie zgadza...
Echo('Złe hasło'); //Wyświetla napis
?>// koniec skryptu
I co, trudne? A teraz formularz, gdzie użytkownikl wprowadza nazwę usera i hasło:
<form action="login.php" method="post">
<table border="0">
<tr>
<td>Login</td><td><input type="text" name="user" size="15"></td>
</tr>
<tr>
<td>Hasło</td><td><input type="password" name="pass" size="15"></td>
</tr>
</table>
<input type="submit" value="Zaloguj"><br>
<font color="red">UWAGA!</font><br>
System rozróżnia małe i duże litery w loginie i haśle, a zatem, jeżeli w polu "Login" wpiszesz<br>
<b>adamo</b>, to nie będzie to to samo co <b>aDAmo</b>!!
</form>
| Ostatnia modyfikacja | 22-06-2006 18:56 | Ostatni autor | marcingorskitygrys |
| Ilość wyświetleń | 45529 | Wersja | 2 |



Ciekaw jestem jednego - załóżmy taka sytuacja - użytkownik i administrator w tym samym czasie odwołują się do tego samego pliku - z tego co mi wiadomo dane mogłyby ulec uszkodzeniu. Wiem że taka sytuacja jest krytyczna, ale zawsze możliwa. Moje pytanie brzmi: czy nie powinno się zablokować dostępu do pliku na czas jego korzystania?
ale z jednym sie zgodze (oryginalny cytat):
"0426-44 <robmal> stefan, Ping! http://4programmers.net/PHP/Prosty_skrypt_logowania Weź tam swoim 4programmersom powiedz że chmod 666 ssie pauke."
ale skrypt ma zbyt duze zaufanie
co orobi potezna luke w bezpieczenstwie
zbyt radosnie przyjmujesz ze user poda tylko login
znajdzie sie wielu takich co sprobuja wpisywac inne rzeczy
np login: htt://moj.serwer/login
i na moim.serwer'rze utworze taki plik to kicha
sugeruje zmienic linie 5 na:
$phaslo="konkretna/sciezka".$login.'.pass'; //przypisuje zmiennej phaslo nazwę pliku z hasłem