Logowanie PHP/MySQL

0

Witam
Mam problem ze skryptem logowania. Poprawnie łączę się z bazą danych, wybieram ją, ładuje się formularz logowania i działała poprawnie większość warunków (sprawdzanie pól, poprawności wpisania hasła i loginu) niestety nawet jeśli hasło i login jest poprawne wyświetla się informacja, że dane są błędne.
Wszystko działa poprawnie na dysku z użyciem serwera KRASNAL, niestety na serwerze cba.pl już nie :/

Kod index.php:

<?
ob_start();
    require_once('./config.php'); // załaczamy plik config.php

    function usun($data){
    
        GLOBAL $dbc;
      if (ini_get('magic_quotes_gpc')){
        $data = stripslashes($data);
      }
       return mysql_real_escape_string($data, $dbc);
    }
	
	if (isset($_POST['submit'])){
    
    if (empty($_POST['login'])){
        $message .= '<font class="blad">Nie podałeś loginu</font><br />';
        $l = FALSE;
    }else{
        $l = usun($_POST['login']);
    }
        
    if (empty($_POST['haslo'])){
        $message .= '<font class="blad">Nie podałeś hasła</font><br />';
        $h = FALSE;
    }else{
        $h = usun($_POST['haslo']);
    }
	
	if ( $l && $h ){
    
    $query1 = "SELECT Nr_konta, Haslo, Typ FROM Konta WHERE Nr_konta='$l' AND Haslo=password('$h') AND Typ='pracownik'";
    $result1 = mysql_query($query1);
        $row1 = mysql_fetch_array ($result1, MYSQL_ASSOC);
		
		 $query2 = "SELECT Nr_konta, Haslo, Typ FROM Konta WHERE Nr_konta='$l' AND Haslo=password('$h') AND Typ='klient'";
    $result2 = mysql_query($query2);
        $row2 = mysql_fetch_array ($result2, MYSQL_ASSOC);
		
		
		if($row1){
    session_start();
        $_SESSION['username'] = $row['username'];
                $_SESSION['haslo'] = $row['haslo'];
        $_GET['cmd'] = 'ok';
        header ("Location: admin.php?cmd={$_GET['cmd']}");  // przekierowuje nas na jaka strone chcemy
    }else if ($row2)
	{
	 session_start();
        $_SESSION['username'] = $row2['username'];
                $_SESSION['haslo'] = $row2['haslo'];
        $_GET['cmd'] = 'ok';
        header ("Location: menu.php?cmd={$_GET['cmd']}");  // przekierowuje nas na jaka strone chcemy
	
	}
	else
	
	{
        $message .= '<font class="blad">Błędne hasło lub login</font><br />';
    }
mysql_close();
}else{
    $message .= '<font class="blad">Spróbuj jeszcze raz</font>';
}
}
ob_end_flush();
?>


<form method="post" action="<? echo $_SERVER['PHP_SELF']; ?>">
    <table align="center" border="0">
        <tr>
            <td align="right" class="uni_01">Login:</td>
            <td><input type="text" name="login" size="30"></td>
        </tr>
        <tr>
            <td align="right" class="uni_01">Hasło:</td>
            <td><input type="text" name="haslo" size="30"></td>
        </tr>
        <tr>
            <td align="right" class="uni_01"> </td>
            <td>
        <p align="center"><input style="font-weight: bold;" type="submit" name="submit" value="loguj">
        </td></tr>
    </table>
</form>


<div align="center">
<? if(isset($message)){
    echo $message;
   }
?>
</div>

Kod config.php (dane wygwiazdkowane specjalnie):

<?
$dbhost = '*****';
$dbuser = '*****'; // tutaj podajemy login do bazy
$dbpass = '*****'; // tutaj podajemy hasło do bazy
$dbname = '*****'; // nazwa bazy danych

$dbc = @mysql_connect($dbhost, $dbuser, $dbpass) or die ('Nie moge połaczyc sie z Mysql'); //łaczymy z baza
mysql_select_db ($dbname) or die ('Nie moge wybrać bazy'); //wybieramy baze danych
?>

Oraz kod tabeli z której korzysta skrypt:

CREATE TABLE Konta (
Id_konta INT NOT NULL AUTO_INCREMENT UNIQUE, 
Nr_konta INT(10), 
Haslo VARCHAR(32) DEFAULT 'haslo', 
Id_klienta INT,
Typ VARCHAR(10); 
Stan_konta FLOAT(10,2), 
PRIMARY KEY (Id_konta),
FOREIGN KEY (Id_klienta) REFERENCES Klienci(Id_klienta));

Jeśli ktoś wie co może być nie tak, to proszę o pomoc bo moja wiedza w tym temacie się już wyczerpała.

0

korzystasz z funkcji skrótu PASSWORD, natomiast pewnie dodając rekordy do bazy z niej już nie korzystasz, szczególnie że masz "DEFAULT haslo"

0

No to akurat nie, bo korzystam z tej funkcji. Haslo do bazy wpisuję tak poprzez PASSWORD('haslo') i w tabeli haslo jest zakodowane, ale wygląda to nieco inaczej niż w krasnalu. W Krasnalu jest to ciąg małych liter i liczb, a na cba.pl wszystko jest drukowane :/

0

No to użyj SHA1(MD5('string')) zamiast PASSWORD i będziesz miał jednolite.

0

Nadal nic :/ Normalnie poroniona sprawa. Na krasnalu oba sposoby działają a na cba.pl oraz ugu.pl nie śmiga :/

0

oO SHA1 i MD5 na krasnalu inaczej działa niż na cba.pl i ugu.pl? To właśnie odkryłeś bardzo poważną kolizję...

Tak serio, pozmieniaj wszystkie PASSWORD(cos) na SHA1(MD5(cos)) i zarejestruj wszystkich userów od nowa.

0

Pisałem, że się na tym nie znam :) Wywaliłem kodowanie i wszystko śmiga, ale sprawdzę jeszcze to co napisałeś :]

EDIT:
Sposób z SHA też nie działa :/ Kiedyś jeszcze popracuję nad tym, na razie to jest zbędna kwestia bo strona i baza nie potrzebuje żadnych zabezpieczeń. Dzięki MONK za pomoc i poświęcony czas :)

0

Demonical co to za: SHA1(MD5('string')) :| znowu rozsiewasz jakieś chore nawyki?
to i tak ma złożoność MD5, więc tylko nie potrzebnie marnuje miejsce w bazie i czas procesora
w dodatku połączenie SHA1 z MD5 zmniejsza złożoność algorytmu i łatwiej by było coś takiego złamać gdyby ktoś się uparł od samego SHA1 czy MD5
chcesz "ulepszyć" funkcję hashującą to ew. użyj soli

0

a do autora - naucz się debugować
dopisz np

echo "weszło";

w kluczowych miejscach skryptu, po ich ilości albo treści możesz zobaczyć gdzie skrypt nie zadziałał zgodnie z oczekiwaniami
potem jeśli np warunek się nie spełnia a powinien to daj var_dump na wszystkie argumenty i zobacz który się nie sprawdza, potem zobacz wyżej czemu ma taką a nie inną wartość
jeśli zapytanie nie zwraca rekordu a powinno to wypisz sobie to zapytanie, użyj mysql_error, daj echo "zapytanie ze zmiennymi" - wklep to zapytanie w phpmyadmin
pomyśl troche, na pewno będzie szybciej niż ktoś ci odpowie na forum

0

gdfgdf, poczytaj o podwójnym hashowaniu.
I naucz się tagu <php></php>.

0
Demonical Monk napisał(a)

gdfgdf, poczytaj o podwójnym hashowaniu.
I naucz się tagu <php></php>.

proszę o linka co dokładnie mam sobie niby przeczytać
bo mi się wydaje że to Ty powinieneś poczytać ogólnie o kryptografii

0

http://www.informatics.susx.ac.uk/courses/dats/notes/html/node108.html - powiedz mi gdzie tu jest o bezpieczeństwie, czy używaniu hashowania w postaci A(B(x)) ?

Podwójne hashowanie - może i dobre, ale do rozwiązywania kolizji w hash mapach, gdzie w tablicy jest tylko 1 element, nie lista elementów.

W kwestii bezpieczeństwa - wywołanie czegoś takiego i tak daje zawsze ten sam wynik, tracisz tylko czas procesora. Jedyna zaleta czegoś takiego, to jak ktoś dorwie się do hashy, to dostanie hashe md5 zamiast prawidłowych haseł. Ale taką samą metode może zastosować na md5 i i tak dostanie poprawne hasła. Zmienia się jedynie czas trwania łamania haseł, gdy i tak już się dorwiesz do bazy danych.

0
gdfgdf napisał(a)

a do autora - naucz się debugować
dopisz np

echo "weszło";

w kluczowych miejscach skryptu, po ich ilości albo treści możesz zobaczyć gdzie skrypt nie zadziałał zgodnie z oczekiwaniami
potem jeśli np warunek się nie spełnia a powinien to daj var_dump na wszystkie argumenty i zobacz który się nie sprawdza, potem zobacz wyżej czemu ma taką a nie inną wartość
jeśli zapytanie nie zwraca rekordu a powinno to wypisz sobie to zapytanie, użyj mysql_error, daj echo "zapytanie ze zmiennymi" - wklep to zapytanie w phpmyadmin
pomyśl troche, na pewno będzie szybciej niż ktoś ci odpowie na forum

Wiedziałem, że w końcu znajdzie cię jakiś "spec". Pisałem, że się uczę, ale mimo to nie trzeba być geniuszem by bez twojego var_dump stwierdzić, że przy tych dwóch warunkach błąd występuje podczas sprawdzania hasła.
A co do "pomyśl trochę", to powiem tyle - nie znasz mnie, nie wiesz ile nad tym siedziałem, więc powstrzymaj się od głupich komentarzy nic nie wnoszących do tematu.
Monk wykorzystał swoją wiedzę by mi pomóc, a czy się pomylił czy też nie schodzi na 2 plan.

Jak już wcześniej pisałem, gdy będę miał więcej czasu posiedzę jeszcze nad tym i skorzystam z twoich wskazówek gdfgdf.

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