Geek tričko zdarma Geek tričko zdarma
Hledáme grafika na pohodovou brigádu v Blenderu nebo programátora na hry v PyGame. Máš zájem? Napiš nám na redakce [zavináč] itnetwork.cz!
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde
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  +1 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  +1 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  +1 17. června 8:34
I have no idea what it is doing but I´m scared to delete it... xD
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.