Programowanie w języku PHP

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.

Szyfrowanie


Niektórzy może nie wiedzą, jak szyfrować tekst. Oto funkcja szyfrująca:
crypt(tekst_do_zaszyfrowania, klucz_szyfrujący);

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

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

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>

10 komentarzy

Black_exploit 2008-05-19 23:30

Osobiście nie preferuję trzymania loginów i haseł w plikach na serwerze, choć jest to też jakiś sposób.

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

bordeux 2007-07-15 14:47

A co to za zmianna post??? opsops ??? Z kosmosu wzieta??

ryszard486 2007-07-14 23:52

Wie ktoś może jak napisać w php, coś podobnego do logowania, tylko że bez podawania loginu? Proszę o pomoc 8469912

flabra 2007-05-28 07:15

peen specu wysil glowke choc troszke zzanim zaczniesz bez sensu komentowac  na podstawie nie swojej wypowiedzi. jak apacz dzialający np. jako wwwrun:www (user:group) mailby odczytac plik np. z prawem 600 i wlascicielem peen:users ? bez prawa dostepu do roota wlasciciela nie zmienisz! conajwyzej 660, jesli ... pomyślisz i zmienisz grupe właściciela pliku na www

ale z jednym sie zgodze (oryginalny cytat):
"0426-44 <robmal> stefan, Ping! Prosty skrypt logowania Weź tam swoim 4programmersom powiedz że chmod 666 ssie pauke."

peen 2007-05-28 04:42

moze mnie nazwiecie głupkiem ale dlaczego jest podany chmod 666?? wg mnie powinien byc raczej 600 jesli juz... po cholere z zewnatrz ma byc dostep do pliku? :/

Bagietka 2006-07-16 23:05

A może w ramach zabezpieczenia przed wprowadzeniem dziwnego loginu sprawdzić z czego się on składa np. żeby mógł zawierać tylko litery, cyfry i "_". Podsuwam pomysł i jednocześnie proszę żeby ktoś to zrobił bo ja w te klocki to troche zielony jestem.

dethim 2006-06-02 19:29

md5 to hashowanie...

Dungeon_Master 2006-04-04 16:35

a md5 to nie szyfrowanie? :]

danyf 2006-03-06 16:41

wszystko ladnie pieknie
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

pawkow 2006-03-06 15:23

może zamiast szyfrowania lepiej byłobyużyć md5 - bezpieczniej