Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz
  • 0

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


TheTroy

Pytanie

Opublikowano

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?

12 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

Opublikowano
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 .

Opublikowano

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.

Opublikowano
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.

Opublikowano
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 ;/

Opublikowano
23 godziny temu, maxaz napisał:

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


$hashedPassword = hash($pass);

Funkcja hash przyjmuje 2 argumenty: rodzaj algorytmu i dane do przetworzenia.

Opublikowano

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>');

 

Opublikowano
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>');
}

 

Opublikowano

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.

Opublikowano
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.

Opublikowano
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.

Opublikowano

spróbuj:

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

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

$hashedPassword = hash($pass);

 

Non omnis moriar.

Opublikowano

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

Cytat

Field 'waluta' doesn't have a default value

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

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...