[Bezpieczeństwo]PHP Logowanie

0

Czy takie logowanie jest bezpieczne ?

<?php
if (isset($_POST['login'])) {
        $login = mysql_real_escape_string(addslashes(strip_tags($_POST['login'])));
        $haslo = md5($_POST['haslo']);
        $Sprawdz=mysql_query("SELECT id FROM users WHERE Login='".$login."' AND Haslo='".$haslo."'");
        $Sprawdzanie = mysql_num_rows($Sprawdz);
        
        if ($Sprawdzanie > 0) {
        session_regenerate_id();
        $_SESSION['IP'] = $_SERVER['REMOTE_ADDR'];
        $_SESSION['name'] = $_POST['login'];
        $_SESSION['login'] = md5(1);
        } else {
            echo("<font color=red><b>Podane dane są nieprawidłowe !</b></font><br /><br />");
        }
}
        

if (isset($_SESSION['login']) && $_SESSION['login'] == md5(1) && $_SESSION['IP'] == $_SERVER['REMOTE_ADDR']) {
    
            echo("<font color='green'><b>Jesteś zalogowany !</b></font> <a href='main.php'>wejdź do panelu</a><br /><br />");
        
                } else {
                    
                session_regenerate_id();
        Echo('<form action="" method="post">');
        Echo('Login: <input  type="text" name="login" class="input" size="25" /><br />');
        Echo('Hasło: <input  type="password" name="haslo" class="input" size="25" /> <br /><br />');
        Echo('<input type="submit" class="submit" name="logon" value="Zaloguj Mnie" /><br /><br /><br />');
        Echo('</form>');
                
                }

?>
0

Według mnie tak. Nie powinno być żadnych powikłań przy "atakach" potencjalnego użytkownika czy "ala" hackera. Oczywiście nie mówię tu o wyczynach naprawdę umiejętnych informatyków... ;P

Pozdro

0

Dodaj sobie jeszcze salt do md5. Zawsze jest to kilka dodatkowych losowych znaków, dzięki którym trudniej odgadnąć hasło.

Przykładowo:
$salt = 'gFkU2U84Gs6kL6';
$haslo = md5($salt.$_POST['haslo']);

Żeby wszystko było ok, musisz jeszcze mieć zakodowane hasło w bazie z dodatkiem tych samych ekstra znaków.

Jeszcze jedno, bądź konsekwentny w tym co robisz.
Wg mnie lepiej stosować:
$_SESSION['name'] = $login;
Zamiast:
$_SESSION['name'] = $_POST['login'];
Po pierwsze przezorny zawsze ubezpieczony. Poza tym nie odwołujesz się do większej struktury tylko do lokalnej zmiennej.
Jest to nieznacznie szybsze ;) Dla krótkiego kodu nie ma to za bardzo znaczenia, ale zawsze warto pisać tak, aby coś wykonywało się szybciej.

0

à propos saltu - nie chodzi tu konkretnie o odgadnięcie hasła, dodanie skomplikowanego saltu zazwyczaj utrudnia jednak kombinację i blokuje możliwość użycia "md5 crackerów" opartych na bazach danych.

$login = mysql_real_escape_string(addslashes(strip_tags($_POST['login'])));

Po co aż tyle? Bezpieczeństwa nigdy za wiele, ale rozsądek też się przydaje. Wystarczy mysql_real_escape_string.

Nie widzę sensu sprawdzania IFem czy $_SESSION['login'] wynosi konkretnie MD5(1), bo ta wartość zawsze będzie albo niezdefiniowana, albo będzie wynosiła MD5(1) w tym wypadku. Lepiej zrobić sobie po prostu switcha:

// w momencie logowania
$_SESSION['authorised'] = TRUE;
$_SESSION['login'] = MD5(1);

// sprawdzanie
if ($_SESSION['authorised'] == TRUE) {
   // zalogowany
} else {
   // niezalogowany
}
0
Demonical Monk napisał(a)

à propos saltu - nie chodzi tu konkretnie o odgadnięcie hasła, dodanie skomplikowanego saltu zazwyczaj utrudnia jednak kombinację i blokuje możliwość użycia "md5 crackerów" opartych na bazach danych.

Dokładnie o to mi chodziło. Niefortunnie nazwałem to odgadywaniem ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1