Skocz do zawartości

Problem z szyfrowaniem hasła


Rekomendowane odpowiedzi

Witam! Jak zwykle gdy wszystkie źródła i mózg zawodzą, zawsze można znaleźć tu pomoc :P

Tym razem kwestia dotyczy PHP, a konkretniej logowania. Otóż mam działający kod rejestracji, który działa i wpisuje wszystkie konkretne dane do do bazy danych, łącznie z zaszyfrowanym hasłem.

SQL: SHA('$password1') < - tym sposobem szyfruję zmienną hasła, przez co w bazie danych dodaje się ciąg cyfr zamiast prawdziwego hasła.

Problem natomiast jest z logowaniem. Przy wpisywaniu danych wyskakuje, że nazwa lub hasło jest błędne. Po głębszym studiowaniu problemu doszedłem do wniosku, iż wina tkwi w logowaniu. Mój kod, który przetwarza zaszyfrowaną postać na normalną, jakoś tego nie robi... natomiast jeśli wpisze ciąg cyfr w polu hasła, loguje się pomyślnie. Problem tkwi więc w tym, że mój skrpyt nie jest jakoś w stanie rozszyfrować hasła. Używam SHA, choć próbowałem zmieniać na sha1 czy md5... Dorzucam kod i liczę na pomoc, z góry dziękuję ;)

PHP:

/ Jeśli użytkownik nie jest zalogowany, należy spróbować go zalogować.
  if (!isset($_SESSION['user_id'])) {
    if (isset($_POST['submit'])) {
      // Łączenie się z bazą danych.
      $dbc = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

      // Pobieranie danych logowania wpisanych przez użytkownika.
      $user_username = mysqli_real_escape_string($dbc, trim($_POST['username']));
      $user_password = mysqli_real_escape_string($dbc, trim($_POST['password']));


      if (!empty($user_username) && !empty($user_password)) {
        // Wyszukiwanie nazwy użytkownika i hasła w bazie danych.
        $query = "SELECT user_id, username FROM gracze WHERE (username = '$user_username' AND password = SHA('$user_password'))";
        $query = "SELECT user_id, username FROM gracze WHERE (username = '$user_username' AND password = '$user_password')";
        $data = mysqli_query($dbc, $query);

        if (mysqli_num_rows($data) == 1) {
          // Dane logowania są poprawne, dlatego należy ustawić zmienne sesji z
    // identyfikatorem i nazwą użytkownika, a następnie przejść do strony głównej.
          $row = mysqli_fetch_array($data);
          $_SESSION['user_id'] = $row['user_id'];
          $_SESSION['username'] = $row['username'];
          setcookie('user_id', $row['user_id'], time() + (60 * 60 * 24 * 30));    // Wygasa za 30 dni.
          setcookie('username', $row['username'], time() + (60 * 60 * 24 * 30));  // Wygasa za 30 dni.
          $home_url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/tribe.php';
          header('Location: ' . $home_url);
        }
        else {
          // Para nazwa użytkownika - hasło jest nieprawidłowa, dlatego należy ustawić komunikat o błędzie.
          $error_msg = 'Musisz podać poprawną parę nazwa - hasło, aby się zalogować.';
        }
      }
      else {
        // Użytkownik nie podał pary nazwa - hasło, dlatego należy ustawić komunikat o błędzie.
        $error_msg = 'Musisz podać parę nazwa - hasło, aby się zalogować.';
      }
    }
  }

 

HTML:

form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <fieldset>
      <legend><b>LOGOWANIE</b></legend>

      <label for="username">Nazwa użytkownika:</label>
      <input type="text" name="username" value="<?php if (!empty($user_username)) echo $user_username; ?>" /><br />
      <label for="password">Hasło:</label>
      <input type="password" name="password" />
            <br />
            <br />
            <input type="submit" value="Zaloguj" name="submit" />
    </fieldset>
  </form>

Odnośnik do komentarza
Udostępnij na innych stronach

// Jeśli użytkownik nie jest zalogowany, należy spróbować go zalogować.
     if (!empty($user_username) && !empty($user_password)) {
        // Wyszukiwanie nazwy użytkownika i hasła w bazie danych.
        $query = "SELECT user_id, username FROM gracze WHERE (username = '$user_username' AND password = SHA('$user_password'))";
        $query = "SELECT user_id, username FROM gracze WHERE (username = '$user_username' AND password = '$user_password')"; /// ???
        $data = mysqli_query($dbc, $query);

Chyba łatwo się domyślić - co może być nie tak. :P

Odnośnik do komentarza
Udostępnij na innych stronach

Najpierw tworzysz zmienna $query z właściwymi parametrami potem zamieniasz zmienną $query na błędne parametry i ja wykonujesz przez mysql_query(). Nic dziwnego ze nie znajduje rekordów gdyż porównujesz zakodowane hasła do nie zakodowanych :). Usuń 2 linijkę z zmienna $query i bd działać :P.

 

PS:

Tak to jest jak się bezmyślnie z książki przepisuje.

Odnośnik do komentarza
Udostępnij na innych stronach

A więc słucham, co może być nie tak?

Z nią czy bez, nie ma różnicy i tak. Wzoruję się na przykładzie z książki, w której są właśnie takie dwie linijki...

Wyrzuć tą książkę, szybko. ;D

 

W internecie już znajdziesz dużo lepsze materiały - na temat PHP (php.net :D) czy mysql.

Odnośnik do komentarza
Udostępnij na innych stronach

Eh.. gdyby to takie proste było.

Tak jak wcześniej powiedziałem, problem nie tkwi w drugiej linijce,a w przykładzie są dwie linijki i wszystko działa. Porównując z działającym tam kodem nie ma żadnej różnicy, ale pomimo tego nie da się zalogować.

 

PS: Problem tkwi na pewno w sposobie szyfrowania. Strona nie może rozszyfrować hasła i dlatego go nie ma.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Ale w podanym przez ciebie przykładzie nie ma szyfrowania, bo pierwsze zapytanie sie nie wykonuje. Zobacz:

 

$query = 1;
$query = 2;
echo $query; // wypisze 2 a nie 1

 

W ksiażce jest błąd, drugiego zapytania nie powinno być.

 

BTW. czy w bazie danych hasło zostało zapisane z użyciem SHA, czy jest czysty tekst ?

Odnośnik do komentarza
Udostępnij na innych stronach

Zostawcie te dwie linijki w spokoju :P

Podczas rejestracji udaje się zaszyfrować, w bazie danych jest ciąg liczb. Problem jest z szyfrowaniem, gdyż gdy wpiszemy w miejsce hasła ciąg cyfr, udaje nam się zalogować. Podobnie gdy wywalimy SHA z zapytania i zmienimy hasło w bazie na jakis normaly wyraz, to da się zalogować.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Bo odpytujesz bazę czy wpisane hasło == temu w bazie (drugie zapytanie), więc musisz podać DOKŁADNIE TO SAMO. Jak zakomentujesz drugie zapytanie, wykona się pierwsze, które wpisane hasło zahaszuje i porówna z tym w bazie...

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...