Autor Zpráva
Martin Brodecký
Profil
Ahoj,
dumám, koukám po google a nikde nic... Napsal jsem si přihlášení uživatele v lightboxu, přihlášení mi funguje bez problémů, ale za boha netuším, jak přímo v lightboxu otestovat validitu přihlašovacích údajů tak, aby se např. označilo políčko jméno a heslo červeně. Mimo lightbox to není problém, ale není mi jasné, když ze stránky a lightboxu odešlu formulář např. na login.php, tam si vyhodnotím zadané údaje a pak co? Jak se vrátit zpět na lightbox a označit nějaká pole? Také mohu formulář odeslat přes AJAX, ale tam mi zas nefunguje přesměrování na stránku přihlášení login.php, po odeslání fomuláře se bez načtení stránky zůstává na lightboxu. Pro kontrolu přihlášení jsem si napsal toto:
$login = mysql_real_escape_string($_POST["nick"]); 
    $heslo = mysql_real_escape_string($_POST["heslo"]); 
    $md5heslo = md5($heslo);

    $dotaz_login = $connectsqli->prepare("SELECT * FROM users WHERE user_login = ? AND user_heslo = ?");
    $dotaz_login->bind_param("ss", $login, $md5heslo);
    $dotaz_login->execute();
    $dotaz_login_result = $dotaz_login->get_result();
    $pocet_zaznamu_login = $dotaz_login_result->num_rows;
    
    while ($row = mysqli_fetch_array($dotaz_login_result))  {
        $login_nm = $row['user_login'];
        $login_psswd = $row['user_heslo'];
        $login_id = $row['id'];
        $skupina = $row['user_skupina'];
      }
    
    
    
    if($pocet_zaznamu_login == 1) {
      $_SESSION['login'] = stripslashes($login_nm);
      $_SESSION['id'] = $login_id;
   
      if($skupina == "b2b") { header("Location: admin-b2b.php"); }
      else { echo "$pocet_zaznamu_login"; }
      die();
    } 
    else { .... // zde potřebuji vygenerovat chybovou hlášku a vrátit se zpět na stránku index.php, vygenerovat lightbox a označit pole se jménem červeně.
    // zápis do LOGu chybně zadané přístupové údaje.
      // Definice proměnných do LOGu
      $datum = Date("j/m/Y H:i:s", Time());
      $IP = $_SERVER['REMOTE_ADDR'];
      $err_uzivatel = $_POST["nick"];
      $err_heslo = $_POST["heslo"];   
      $log_zapis = "
        $datum --- IP: $IP --- Uživatel: $err_uzivatel --- Heslo: $err_heslo \n\r 
      ";
      $log_neopravneny_pristup = fopen("../../log/ERRlg/login.txt", "a");
      fwrite($log_neopravneny_pristup, $log_zapis);
      fclose($log_neopravneny_pristup);
      }
Sitole
Profil
Martin Brodecký:
Co použít například GET? Jestliže je v url obsažená proměnná s hodnotou wrong-pass zobrazíš lightbox a podle hodnoty proměnné ukážeš na to co bylo vlastně špatně (v tomto případě heslo). Například (/?login=wrong-pass).
Fisir
Profil
Reaguji na Martina Brodeckého:
Nedá mi to a musím ke tvému kódu připsat pár poznámek:

1.) V případě, že používáš prepared statements (takové to $connectsqli->prepare()), escapování se děje automaticky. Z tohoto důvodu je pak ruční escapování vkládaných hodnot chybné, jelikož ti tam pak budou přebývat zpětná lomítka. Funkci mysql_real_escape_string() na řádcích 1 a 2 můžeš odstranit (a když opravíš již uložená data v databázi, tak i stripslashes() na řádku 21).
2.) MD5 se dnes už nepoužívá, je to bezpečnostní díra. Použij prosím funkci password_hash() a pro ověření správnosti hesla pak password_verify(). Pokud na serveru běží starší PHP než 5.5, budeš muset použít knihovnu password_compat. Připomínám, že pokud už máš nějaká hesla zahashována, budeš muset uživatele poprosit o jejich reset a zahashovat je znovu s použitím zmíněných funkcí.
3.) Není třeba používat cyklus while, funkci mysqli_fetch_array() stačí zavolat jen jednou, jelikož login je (snad) unikátní.
4.) Používáš objektový přístup k MySQLi, tak si to nekaž funkcí mysqli_fetch_array() na jedenáctém řádku. Použij raději $dotaz_login_result->fetch_assoc(). Je dobré být konzistentní.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: