[PHP] Zalogowany użytkownik z opóźnieniem

Witam

 

Kreuje sobie stronę internetową. Jest to strona Drukarni cyfrowej.

Dla mnie to wygląda podejrzanie:

$_SESSION['nickUzytkownika'] = $_COOKIE['nick']

Pięknie wygląda odwołanie do cookie… Przekazuj od razu nick do sesji, zamiast używania cookies.

Swoją drogą zmień

$_SESSION['zalogowany'] = 'tak';

na

$_SESSION['zalogowany'] = true;

Kilka uwag:

  1. Twój kod jest podatny na SQL injection, ponieważ używasz takiego zapytania SQL bez filtrowania danych wejściowych od użytkownika (z $_POST):

    SELECT * FROM uzytkownicy WHERE nick=’$nick’ AND haslo=’$haslo’

To jest karygodny błąd i podstawowa sprawa przy obrabianiu formularzy - warto, żebyś utrwalił sobie poprawne postępowanie w takich przypadkach.

 

  1. Masz dziwny sposób uzyskania danych użytkownika po zalogowaniu - po co jeszcze raz wykonujesz zapytanie o te dane, jak masz je po pierwszym?

 

  1. Jak już poprzednicy zauważyli, pobierasz nazwę użytkownika z ciasteczka, ale ono - przy sprawdzaniu (po stronie serwera!) poprawności zalogowania się - nie jest (jeszcze) ustawione (będzie dopiero po przeładowaniu strony) - użyj zatem zmiennej $nickWyswietl:

    $_SESSION[‘nickUzytkownika’] = $nickWyswietl;

  2. Pętla while, której używasz do wyszukania nazwy nicka, jest bez sensu - po pierwsze przecież znasz nazwę tego nicka (podaną przy logowaniu), i jest ona poprawna (bo w bazie jest taki nick) - a po drugie zakładasz, że możesz mieć w bazie więcej niż jeden rekord z danym nickiem (ta pętla)? Według mnie to chyba nie jest poprawna sytuacja (i powinieneś przy zakładaniu konta sprawdzać istnienie już takiego nicka).

<?php

function loguj() {
if(empty($_POST['nick']) AND empty($_POST['haslo'])) {
echo "Wypelnij wszystkie pola!";
} elseif (empty($_POST['nick'])) {
echo "Podaj nick!";
} elseif (empty($_POST['haslo'])) {
echo "Podaj haslo!";
} else {

$nick = $_POST['nick'];
$haslo = md5($_POST['haslo']);
$polacz = mysqli_connect(" ZAKAZANE ")or die ("blad polaczenia: " .mysqli_connect_error());
$query = mysqli_query($polacz,"SELECT * FROM uzytkownicy WHERE nick='$nick' AND haslo='$haslo' ");

if(mysqli_num_rows($query) == 1) {
$que = mysqli_query($polacz, "select * FROM uzytkownicy WHERE nick='$nick'"); 
while($res = mysqli_fetch_assoc($que)){
$nickWyswietl = $res["nick"];
setcookie('nick',$nickWyswietl,time()+3600,1);
}
$_SESSION['zalogowany'] = 'tak';
$uzytkownik = mysqli_fetch_assoc($query);
$_SESSION['idUzytkownika'] = $uzytkownik['id'];
$_SESSION['nickUzytkownika'] = $_COOKIE['nick'];

$_SESSION['hasloUzytkownika'] = $uzytkownik['haslo'];
header ("Location: index.php");
} else {
echo "Nie istniej taki uzytkownik!";
}

}
}


?>

Niewiem, jak ty, ale ten kod wygląda jakby był pisany na poczekaniu, ponieważ wykonujesz mase zbędnych operacji, przez co zaciemniasz kod

i zwiekszasz prawdopodobieństwo wystąpienia błedu jak ten. A patrzac na kod to po co tworzysz ciasteczka? Niektórzy użytkownicy mają wyłączoną

obsługe ciasteczek a poza tym sesja też tworzy ciastko o nazwie PHPSESSID. Problem nie tylko tkwi w kodzie ale również leży u podstaw.

<?php
     
function loguj() {
    if(empty($_POST['nick']) AND empty($_POST['haslo'])) {
        echo "Wypelnij wszystkie pola!";
    } elseif (empty($_POST['nick'])) {
        echo "Podaj nick!";
    } elseif (empty($_POST['haslo'])) {
        echo "Podaj haslo!";
    } else {
        
        $nick = $_POST['nick'];
        $haslo = md5($_POST['haslo']);
		
        $polacz = mysqli_connect(" ")or die ("blad polaczenia: " .mysqli_connect_error());
		
        $query = mysqli_query($polacz,"SELECT count(*) cnt FROM uzytkownicy WHERE nick='$nick' AND haslo='$haslo' ");
		
        $tabl = mysqli_fetch_assoc($query);
		
        if(mysqli_num_rows($query) == 1) 
			{
				 if ($tabl['cnt'])
                     {
					
					$_SESSION['zalogowany'] = 'tak';
                    setcookie("nick",$_POST['nick'],time()+3600,1);
					setcookie("id_sesji", md5(rand(-100, 100)),time()+3600);
					header ("Location: _funkcje/autoryzacja.php");
					
				}
			} 
			else 
			{
            echo "Nie istniej taki uzytkownik!";
            }
    
    }
}


?>

 

Wiem że leży, a w dodatku kwiczy, ale kiedyś trzeba się tego nauczyć. Strona jest tak czy siak dla mnie (jeśli kiedyś zdobędę kase to sobie drukarnie założę :slight_smile: ) dlatego już teraz bawie się z tym. A tak na prawdę rozglądając się za różnymi stronami, patrząc na różne tutoriale, to logowanie/rejestracja itp to w zasadzie podstawa :slight_smile:

 

 

 

 

używając mysqli_real_escape_string, już w procesie rejestracji do bazy wpadają puste pola, a użytkownik się rejestruje. Usunałem to aby sprawdzić czy to nie sprawia jakiegoś kłopotu. Użytkownicy zaczęli się logować, więc zostało - co nie zmienia faktu że to ogromny bląd.

Do wszystkiego powoli dochodzę, mogę już rejestrować użytwkoników z mysqli_real_escape_string. Teraz pozostało mi logowanie poprawić

tutaj rejestracja.php

<?php


function rejestruj(){
    if(empty($_POST['imie']) AND empty($_POST['nazwisko']) AND empty($_POST['nick']) AND empty($_POST['email']) AND empty($_POST['haslo']) AND empty($_POST['haslo2'])) {
        echo "Wypelnij wszystkie pola.";
    } elseif(empty($_POST['imie'])){
        echo "Podaj imie";
    } elseif(empty($_POST['nazwisko'])){
        echo "Podaj nazwisko";
    } elseif (empty($_POST['nick'])) {
        echo "Podaj nick";
    } elseif (empty($_POST['email'])){
        echo "Podaj email";  
    } elseif (empty($_POST['haslo'])) {
        echo "Podaj haslo";
    } elseif (empty($_POST['haslo2'])) {
        echo "Powtorz haslo";
    } else {   
	
        $polacz = mysqli_connect(" ")or die ("blad polaczenia: " .mysqli_connect_error());
        
		
		
        $imie = mysqli_real_escape_string($polacz,$_POST['imie']);
        $nazwisko = mysqli_real_escape_string($polacz,$_POST['nazwisko']);
        $nick = mysqli_real_escape_string($polacz,$_POST['nick']);
        $email = mysqli_real_escape_string($polacz,$_POST['email']);
        $haslo = mysqli_real_escape_string($polacz,$_POST['haslo']);
        $haslo2 = mysqli_real_escape_string($polacz,$_POST['haslo2']);

        
		
        
         $query = mysqli_query($polacz,"SELECT nick FROM uzytkownicy WHERE nick = '$nick'");
       
        
        if(mysqli_num_rows($query) >= 1) {
            echo "Taka nazwa użytkownika już istnieje!";
        } elseif ($haslo != $haslo2){
            echo "Hasła nie zgadzaja sie";
        } else {
            echo "Zarejestrowales sie!";
            mysqli_query($polacz,"INSERT INTO uzytkownicy (imie,nazwisko,nick,email,haslo,haslo2) VALUES('$imie','$nazwisko','$nick','$email',md5('$haslo'),md5('$haslo2'))");
            
        }
    } 
}
?>

Co do “opóźnienia” wyświetlania użytkownika już rozwiązałem. Ale w dalszym ciągu jest wiele niedociągnięc. Nie nalegam na pomoc, ale każda wskazówka, czy wytkniety błąd to dla mnie sporo nowej wiedzy, czy nowej rozkminy którą będę rozpatrywał, więc dzięki za każdy komentarz!

 

<?/* Copyright by fedora24x; 2014*/function add_user($login, $password) { if(!$login || !$password) { exit; } $login = stripslashes(strip_tags(trim($login))); $password = stripslashes(strip_tags(trim($password))); $mysql = @mysql_connect('localhost', 'user', 'password') or die('MySQL: erorr: mysql_connect') and exit; @mysql_selct_db('database', $mysql) or die('MySQL: erorr: mysql_select_db') and exit; $query = 'insert into user(login, password) values('.$login.', SHA1("'.$password.'"))'; @mysql_query($query, $mysql) or die('MySQL: erorr: mysql_query') and exit; @mysql_close($mysql); return true; } function login_user($login, $password) { if(!$login || !$password) { exit; } $login = stripslashes(strip_tags(trim($login))); $password = stripslashes(strip_tags(trim($password))); $mysql = @mysql_connect('localhost', 'user', 'password') or die('MySQL: erorr: mysql_connect') and exit; @mysql_selct_db('database', $mysql) or die('MySQL: erorr: mysql_select_db') and exit; $query = 'select login from user usr where usr.login="'.$login.'" and usr.password=SHA1("'.$password.'")'; $exist = @mysql_query($query, $mysql); if(!$exit) { echo 'MySQL: erorr: mysql_query'; exit; } @mysql_close($mysql); return true;}?>

Tu masz kod, ale musisz sobie rozbudować funkcje add_user() o sprawdzanie loginów, aby się nie powtarzały.

Pomogło?