November Black Friday C# týden
BlackFriday je tu! Využij jedinečnou příležitost a získej až 80 % znalostí navíc zdarma! Více zde
Pouze tento týden sleva až 80 % na e-learning týkající se C#
Avatar
Stivko
Člen
Avatar
Stivko:16. června 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. června 19:25
Odpovědět
16. června 19:24
Nikdy není pozdě začít s něčím novým
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na Stivko
Jindřich Máca:16. června 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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět
16. června 22:42
Avatar
Petr Langer
Člen
Avatar
Odpovídá na Jindřich Máca
Petr Langer:16. června 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. června 23:13
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Jaroslav Smrž
Redaktor
Avatar
Odpovídá na Stivko
Jaroslav Smrž:17. června 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. června 8:34
/* Life runs on code */
Avatar
gorri
Člen
Avatar
Odpovídá na Stivko
gorri:17. června 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. června 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. června 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. června 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.