Skocz do zawartości
  • 0

Błąd z formularzem rejestracji (hashowanie hasła)


TheTroy

Pytanie

Witam. Otóż mam problem z formularzem rejestracji wywala mi taki oto komunikat:

Cytat

Strict standards: Non-static method user::passSalter() should not be called statically in

C:\wamp64\www\register.php on line 75

oto kod z 75 linii:

$pass = user::passSalter($pass);

dane które są pobierane z formularza:

$login = mysql_real_escape_string(htmlspecialchars($_POST['login']));
$pass = mysql_real_escape_string(htmlspecialchars($_POST['pass']));
$pass_v = mysql_real_escape_string(htmlspecialchars($_POST['pass_v']));
$email = mysql_real_escape_string(htmlspecialchars($_POST['email']));
$email_v = mysql_real_escape_string(htmlspecialchars($_POST['email_v']));

a tutaj jest sam formularz HTML:

<form method="post" action="">
	 <p>Login:</p>
	<input maxlength="24" type="text" name="login" id="login"/>

	<p>Hasło:</p>
	<input maxlength="32" type="password" name="pass" id="pass"/><br/>
					  
	<p>Powtórz hasło:</p>
	<input maxlength="32" type="password" name="pass_v" id="pass_again"/><br/>
					  
	<p>E-mail:</p>
	<input type="text" name="email" maxlength="50" id="email"/><br/>
					  
	<p>Powtórz e-mail:</p>
	<input type="text" maxlength="50" name="email_v" id="email_again"/><br/>

	<p id="register-info">Posiadasz już konto? <a href="login.php#form-login">Zaloguj się.</a></p>
						
	<input type="hidden" name="send" value="1" /><br/>
	<input type="submit" value="Zarejestruj" class="register"/>
</form>

Wie może ktoś jakby naprawić ten błąd?

Odnośnik do komentarza
Udostępnij na innych stronach

12 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

8 godzin temu, maxaz napisał:

spróbuj:


$user = new user();
$user->passSalter($pass);

Jak chcesz samo hash, to po prostu używasz go na stringu:


$hashedPassword = hash($pass);

 

Niestety dalej nie działa ;/ może podam ci cały kod rejestracji i go se ogarniesz:

<?php
	require './config/config.php'; // plik konfiguracyjny i połączenie z bazą
	require_once './config/user.class.php';

	/**
	 * Sprawdź czy formularz został wysłany
	 */
	if (@$_POST['send'] == 1) {
		// Zabezpiecz dane z formularza przed kodem HTML i ewentualnymi atakami SQL Injection
		$login = mysql_real_escape_string(htmlspecialchars($_POST['login']));
		$pass = mysql_real_escape_string(htmlspecialchars($_POST['pass']));
		$pass_v = mysql_real_escape_string(htmlspecialchars($_POST['pass_v']));
		$email = mysql_real_escape_string(htmlspecialchars($_POST['email']));
		$email_v = mysql_real_escape_string(htmlspecialchars($_POST['email_v']));
		

		/**
		 * Sprawdź czy podany przez użytkownika email lub login już istnieje
		 */
		$existsLogin = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM users WHERE login='$login' LIMIT 1"));
		$existsEmail = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM users WHERE email='$email' LIMIT 1"));

		$errors = ''; // Zmienna przechowująca listę błędów które wystąpiły


		// Sprawdź, czy nie wystąpiły błędy
		if (!$login || !$email || !$pass || !$pass_v || !$email_v ) $errors .= '- Musisz wypełnić wszystkie pola<br />';

		if ($existsLogin[0] >= 1) $errors .= '- Ten login jest zajęty<br/>';
		if ($existsEmail[0] >= 1) $errors .= '- Ten e-mail jest już używany<br/>';
		if ($pass != $pass_v)  $errors .= '- Hasła się nie zgadzają<br/>';
		
		if (empty($email))
			{ $errors .=''; }
		elseif (preg_match('/^[a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ0-9\-\_\.]+\@[a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ0-9\-\_\.]+\.[a-z]{2,4}$/',$email) == false) 
			{ $errors .= '- E-mail jest nieprawidłowy<br/>'; }
		elseif ($email != $email_v)
			{ $errors .= '- E-maile się nie zgadzają<br/>'; }
		

		/**
		 * Jeśli wystąpiły jakieś błędy, to je pokaż
		 */
		if ($errors != '') {
			echo '<p class="error">Rejestracja nie powiodła się, popraw następujące błędy:<br />'.$errors.'</p>';
		}

		/**
		 * Jeśli nie ma żadnych błędów - kontynuuj rejestrację
		 */
		else {

			// Posól i zasahuj hasło
			$user = new user();
			$user->passSalter($pass);

			// Zapisz dane do bazy
			mysql_query("INSERT INTO users (login, email, pass) VALUES('$login','$email','$pass');") or die ('<p class="error">Wystąpił błąd w zapytaniu i nie udało się zarejestrować użytkownika.</p>');

			echo '<p class="success">'.$login.', zostałeś zarejestrowany.
			<br /><a href="login.php">Logowanie</a></p>';
		}
	}
	?>

a passSalter pobiera z innego pliku tu poniżej masz zawartość jak to "passSalter" wygląda w 2 pliku:

public function passSalter ($pass) {
        $pass = '$@@#$#@$'.$pass.'q2#$3$%##@';
        return md5($pass);
    }

Tu powyżej gdzie pisze:

[email protected]

powinno być: $ @ @ # $ # @ $ dodałem odstęp od tego aby nie wywalało tego tekstu bo wcięło się to co wyżej .

Odnośnik do komentarza
Udostępnij na innych stronach

Używanie md5 do hashowania haseł w 2018 nie jest zbyt dobrym pomysłem. Ponownie namówię Cię do skorzystania z wbudowanej w PHP funkcji hash -- jest ona bezpieczniejsza. Przy sprawdzaniu hasła, po prostu porównujesz hash z inputa z hashem w bazie danych.

Non omnis moriar.

Odnośnik do komentarza
Udostępnij na innych stronach

18 godzin temu, Aranthor napisał:

I ponownie rozchodzi się o nieczytanie treści błędów. Przecież masz napisane:

Podczas dodawania nowego użytkownika (INSERT INTO users) musisz podać wartość kolumny waluta.

Ooo no zapomniałem że dodałem dodatkowe wartości w bazie danych dzięki mordeczko pomogłeś!

Już wszystko działa :D

Temat do zamknięcia.

Odnośnik do komentarza
Udostępnij na innych stronach

6 godzin temu, maxaz napisał:

Używanie md5 do hashowania haseł w 2018 nie jest zbyt dobrym pomysłem. Ponownie namówię Cię do skorzystania z wbudowanej w PHP funkcji hash -- jest ona bezpieczniejsza. Przy sprawdzaniu hasła, po prostu porównujesz hash z inputa z hashem w bazie danych.

Hmm no okey to w takim razie jak mam to przerobić żeby działało bo gdy używam teraz:

$user = new user();
$user->passSalter($pass);

zamiast:

$pass = user::passSalter($pass);

to już nie wyświetla żadnych komunikatów z błędami, ale wyskakuje komunikat z echo że nie można było się zarejestrować. No i niestety nie działa ;/

Odnośnik do komentarza
Udostępnij na innych stronach

Teraz gdy zastosowałem to:

$hashedPassword = hash($pass);

wywala mi taki błąd:

Cytat

Warning: hash() expects at least 2 parameters, 1 given in 

dalszy kod wygląda tak: 

// Zapisz dane do bazy
mysql_query("INSERT INTO users (login, email, pass) VALUES('$login','$email','$pass');") or die ('<p class="error">Wystąpił błąd w zapytaniu i nie udało się zarejestrować użytkownika.</p>');

i próbowałem nawet zmieniać w VALUES $pass na $hashedPassword

kombinowałem z tym ale nadal ten sam błąd mi pokazuje ;/

Może to przez to że korzystam z wampp'a a wcześniej korzystałem z xampp'a i tam wszystko mi działało dobrze, może to przez to? bo nawet bez hash'owania hasła już nie wyskakuje mi ten Warning, tylko już sama wiadomość:

Cytat

Wystąpił błąd w zapytaniu i nie udało się zarejestrować użytkownika.

z ten linii:

// Zapisz dane do bazy
mysql_query("INSERT INTO users (login, email, pass) VALUES('$login','$email','$pass');") or die ('<p class="error">Wystąpił błąd w zapytaniu i nie udało się zarejestrować użytkownika.</p>');

 

Odnośnik do komentarza
Udostępnij na innych stronach

14 minut temu, TheTroy napisał:

wywala mi taki błąd:

Cytat

Treść błędu mówi sama za siebie, wystarczyło go przeczytać. Zresztą napisałem o tym 2 posty wyżej: funkcja hash potrzebuje dwóch argumentów:

$wynik = hash('sha256', 'tekst wejściowy');

 

Dobrze by było wyświetlić ostatni błąd MySQL, aby dowiedzieć się, dlaczego zapytanie nie zadziałało:

if (!mysql_query("INSERT INTO users (login, email, pass) VALUES('$login','$email','$pass');")) {
	die ('<p class="error">Wystąpił błąd w zapytaniu i nie udało się zarejestrować użytkownika: ' . mysql_error() . '</p>');
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

Metoda passSalter nie jest statyczna — aby jej użyć, musisz utworzyć instancję klasy user.

Gdybyś wstawił kod klasy user, byłoby dużo łatwiej.

Poza tym, funkcja hash nie jest wystarczająca do zabezpieczenia hasła?

Non omnis moriar.

Odnośnik do komentarza
Udostępnij na innych stronach

1 godzinę temu, maxaz napisał:

Metoda passSalter nie jest statyczna — aby jej użyć, musisz utworzyć instancję klasy user.

Gdybyś wstawił kod klasy user, byłoby dużo łatwiej.

Poza tym, funkcja hash nie jest wystarczająca do zabezpieczenia hasła?

Mógłbyś mi w tym pomóc bo za bardzo nie wiem jak to zrobić zamiast tego:

user::passSalter($pass);

czy też po user:: to zastosować?

Jakbyś mi z tym pomógł byłbym bardzo ci wdzięczny.

Odnośnik do komentarza
Udostępnij na innych stronach

5 godzin temu, Aranthor napisał:

Treść błędu mówi sama za siebie, wystarczyło go przeczytać. Zresztą napisałem o tym 2 posty wyżej: funkcja hash potrzebuje dwóch argumentów:


$wynik = hash('sha256', 'tekst wejściowy');

 

Dobrze by było wyświetlić ostatni błąd MySQL, aby dowiedzieć się, dlaczego zapytanie nie zadziałało:


if (!mysql_query("INSERT INTO users (login, email, pass) VALUES('$login','$email','$pass');")) {
	die ('<p class="error">Wystąpił błąd w zapytaniu i nie udało się zarejestrować użytkownika: ' . mysql_error() . '</p>');
}

 

Okey tera wywala taki oto błąd:

Cytat

Wystąpił błąd w zapytaniu i nie udało się zarejestrować użytkownika: Field 'waluta' doesn't have a default value

może to jest związane gdzieś z tym kodem? 

<?php

class user {

    public static $user = array();
    
    /**
     * Zwraca tablicę ze wszystkimi danymi o użytkowniku.
     * Indeksy tablicy odpowiadają nazwom pól w bazie danych (login, pass etc...)
     * @param string $login
     * @param string $pass
     * @return array
     */
    public function getData ($login, $pass) {
        if ($login == '') $login = $_SESSION['login'];
        if ($pass == '') $pass = $_SESSION['pass'];

        self::$user = mysql_fetch_array(mysql_query("SELECT * FROM users WHERE login='$login' AND pass='$pass' LIMIT 1;"));
        return self::$user;
    }

    
    /**
     * Zwraca tablicę ze wszystkimi danymi o użytkowniku, tak jak powyższa metoda klasy,
     * ale rozpoznaje użytkownika nie po podaniu loginu i hasła tylko po podaniu ID.
     * Używana np. do wyświetlania strony profilu.
     * @param int $id
     * @return array
     */
    public function getDataById ($id) {
        $user = mysql_fetch_array(mysql_query("SELECT * FROM users WHERE id='$id' LIMIT 1;"));
        return $user;
    }

    /**
     * Jeśli użytkownik jest zalogowany - zwraca true, w przeciwnym wypadku - false
     * @return bool
     */
    public function isLogged () {
     if (empty($_SESSION['login']) || empty($_SESSION['pass'])) {
      return false;
     }

     else {
      return true;
     }
    }


}

Ten powyższy kod jest inplementowany do rejestracji:

require_once './config/user.class.php';

Może to ci w czymś pomoże.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający forum Błąd z formularzem rejestracji (hashowanie hasła)   0 użytkowników
    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...