Prosty skrypt logowania

Infor_mat_ik

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

Do zaszyfrowania tekstu, należy użyć funkcji która jest kryptograficznie bezpieczna, np crypt:

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>');
}
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>';
    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 hasło się nie zgadza...
    echo 'Złe hasło';
}
?>

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

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

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

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

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! http://4programmers.net/PHP/Prosty_skrypt_logowania Weź tam swoim 4programmersom powiedz że chmod 666 ssie pauke."

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

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.

md5 to hashowanie...

a md5 to nie szyfrowanie? :]

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

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