IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Nechce mě to i přes správně zadané heslo přesměrovat.| LOGIN SYSTEM

Aktivity
Avatar
Stivko
Člen
Avatar
Stivko:16.6.2019 19:24

Ahoj,

Dělám redakční systém a momentálně dělám login. Nedělám register, protože nepotřebuji a nechci, abych v něm měl více uživatelů a chci, aby se přihlásil pouze ten, koho "natvrdo" nastavím v databázi. Vše jsem udělal dle zdejších návodů a zdálo se, že to funguje (zobrazení chybné zprávy o nevyplnění všech polí, chybna zprava o špatnem heslu). Zjistil jsem ale, že ikdyž zadám správné heslo a jméno, které je nastaveno v databázi, tak mi to stejně hodí můj nastavený error, že heslo není dobře.

Zkusil jsem: Zde přikládám svůj kód.

<?php
session_start();
require('Db.php');
Db::connect('localhost', 'loginsystem', 'root', '');

if (isset($_SESSION['uzivatel_id'])) {
    header ('Location: administrace.php');
    exit();
}

if ($_POST) {
    $uzivatel = Db::queryOne('
    SELECT user_id, user_password
    FROM users
    WHERE user_uid=?', $_POST['username']);
    if (!empty($_POST['username']) || !empty($_POST['password'])) {
        if (!password_verify($_POST['password'], $uzivatel['user_password'])) {
            $zprava = "Nesprávné uživatelské jméno nebo heslo";
        }
        else {
            $_SESSION['uzivatel_id'] = $uzivatel['user_id'];
            $_SESSION['uzivatel_jmeno'] = $uzivatel['user_uid'];
            header ('Location: administrace.php');
            exit();
        }
    }
    else {
        $zprava ="Vyplňte prosím pole";
    }
}

Zde je pak soubor administrace.php, kde se nachází obsah pouze pro přihlášenou osobu.

<?php
  session_start();
  if(!isset($_SESSION['uzivatel_id'])) {
    header ('Location: index.php');
    exit();
  }

  if (isset($_GET['odhlasit'])) {
    session_destroy();
    header('Location: index.php');
    exit();
  }
?>

Za php tagem se nachází už jen suché HTML.

Chci docílit: Budu moc rád, pokud mi zde napíšete nějaké rady, tipy na řešení atp. Pokud jsem někde udělal nějakou "trapnou" chybu, tak se omlouvám, ale PHP se teprve učím. Předem děkuji za jakékoliv rady.

Editováno 16.6.2019 19:25
Odpovědět
16.6.2019 19:24
Nikdy není pozdě začít s něčím novým
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Stivko
Jindřich Máca:16.6.2019 22:42

Ahoj, první věc, co mě tak napadá, jestli jak jsi "natvrdo" zadával uživatelské údaje do databáze, zda jsi jim vyplnil hesla ve správné hashované podobě? :-`

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
16.6.2019 22:42
Avatar
Petr Langer
Člen
Avatar
Odpovídá na Jindřich Máca
Petr Langer:16.6.2019 23:13

Hesla nejspíš uložil v plaintextu a teď je porovnává s hashem. To bude na 95 % ten problém.

 
Nahoru Odpovědět
16.6.2019 23:13
Avatar
Jaroslav Smrž
Tvůrce
Avatar
Odpovídá na Stivko
Jaroslav Smrž:17.6.2019 8:34

Rozhodně jak píšou kluci. Když máš u přihlášení hash a záznamy ukládáš přímo v phpMyAdmin, tak to nikdy nemůže fungovat. Buď vymaž čtení otisku hesla při přihlášení, což nedoporučuji nebo si napiš registrační stránku, přes kterou vložíš uživatele do DB s otiskem hesla a pak ji klidně vymažeš z produkce. Pak ti vše bude fungovat. Koukám, že tam nemáš použity výjimky, takže ti to nevyhodí žádnou hlášku o chybě při špatném čtení otisku.

Nahoru Odpovědět
17.6.2019 8:34
/* Life runs on code */
Avatar
gorri
Člen
Avatar
Odpovídá na Stivko
gorri:17.6.2019 11:23

Trochu jsem to přepsal. Takhle to bude ideální nejspíše.

if($_POST)
{
    if(Db::querySingle('SELECT user_id, user_password FROM users WHERE user_id=? AND user_password=?', $_POST['username'], hash('sha512', $_POST['password'])))
    {
        $_SESSION['uzivatel_id'] = $_POST['username'];
        header('Location: administrace.php');
    }
    else
    {
        echo 'Chybová hláška dle libosti';
    }
}

Nahraď toto

if ($_POST) {
    $uzivatel = Db::queryOne('
    SELECT user_id, user_password
    FROM users
    WHERE user_uid=?', $_POST['username']);
    if (!empty($_POST['username']) || !empty($_POST['password'])) {
        if (!password_verify($_POST['password'], $uzivatel['user_password'])) {
            $zprava = "Nesprávné uživatelské jméno nebo heslo";
        }
        else {
            $_SESSION['uzivatel_id'] = $uzivatel['user_id'];
            $_SESSION['uzivatel_jmeno'] = $uzivatel['user_uid'];
            header ('Location: administrace.php');
            exit();
        }
    }
    else {
        $zprava ="Vyplňte prosím pole";
    }
}

tím co jsem ti napsal. Zkus to. Rozhodně ještě předtím doporučuji do DB napsat otisk hesla. Kdyžtak to udělej takhle.

echo hash('sha512', 'nejakéheslosizdenapis');

a výsledek si ulož do DB. Nezapomeň ten řádek pak smazat ;-)

Nahoru Odpovědět
17.6.2019 11:23
Když vím, tak poradím. Nikdo neví všechno :-)
Avatar
Stivko
Člen
Avatar
Odpovídá na Jindřich Máca
Stivko:17.6.2019 16:16

Ahoj,

Nevšiml jsem si, že ta funkce je pouze na hashované hesla, funkci jsem dal pryč a upravil a jede to. Díky moc.

Nyní mám však další problém. Nahrál jsem své soubory na cvičný free hosting a když se chci dostat do sekce s loginem napíše mi to error "stránka nemůže tento požadavek zpracovat HTTP error 500" co jsem tak hledal, tak je chyba s nějakým nastavení HTTP nebo co, setkal ses někdy s tím?

Nahoru Odpovědět
17.6.2019 16:16
Nikdy není pozdě začít s něčím novým
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.