Autor Zpráva
Awer-Graphic
Profil
Jak děláte přihlašování úživatelů, a jaký k tomu máte názor? Já osobně jej vždy provádím takto:

class.LoginUser.php
<?php
class LoginUser {
    public function Login($usernameX, $passwordX) {
    if(isset($usernameX) and isset($passwordX)) {

        $username = mysql_real_escape_string($usernameX);
        $password = mysql_real_escape_string($passwordX);
        $loginQuery = mysql_query('select * from users where username="'.$username.'" and password="'.$password.'"');
        $loginResult = mysql_fetch_array($loginQuery); 
        
        if($loginQuery) {

            $_SESSION['logged'] = $loginResult['iduser'];
            $_SESSION['msg'] = 'Byl(a) jsi přihlášen.';
            header('Location: index.php');

        } else {

            $_SESSION['msg'] = 'Špatné jméno nebo heslo';
            header('Location: index.php');

        }
    }
    }
}
?>

janevimco.php

<?php
require 'class.LoginUser.php';

$login = new LoginUser;
$login -> Login($_POST['username'], $_POST['password']);

...
Formulář
...
?>

index.php

<?php
...
echo $_SESSION['msg'];
...
?>
mimochodec
Profil
Máš tam přinejmenším dva překlepy (username na ř. 6 a "myqsl" na ř. 7), kromě toho "select * ..." je zbytečný, když potřebuješ jen ID. Ale principielně se to takhle nějak dělá.
Awer-Graphic
Profil
mimochodec:
Díky, ani jsem si toho nevšiml. Ale jinak přece to id nezískáš, a má to i výhody, že si do Sessions můžeš uložit například jméno uživatele, nebo další údaje.
Edit - A samozřejmě to také zjišťuje, jestli uživatel napsal správné udaje.
nethor
Profil
To je myslím ok, jen do $_SESSION bych si uložil všechny info o uživateli.
Pak se pro ně nemusí pokaždé šahat do databáze.
(edit: pozdě, ale koukám, že k věci :)
mimochodec
Profil
Awer-Graphic:
le jinak přece to id nezískáš

Špatně jsem to napsal. Nemyslel jsem celý ten select, ale tu hvězdičku. Chtěl jsem říct, ať tím selectem nenačítáš všechno, ale jen to, co za běhu budeš potřebovat. Co do toho spadá, se může lišit aplikaci od aplikace.
Awer-Graphic
Profil
mimochodec:
Aha, tak to pak jo.
Joker
Profil
Awer-Graphic:
„Praktické“ chyby:
• V dotazu se porovnává heslo proti hodnotě, kterou zadal uživatel. To by ovšem v databázi muselo být uložené přímo uživatelovo heslo, což je z hlediska bezpečnosti nepřijatelné. Měl by se ukládat (a tedy i porovnávat) jen hash hesla.
• Je zbytečné dělat SELECT *, když jediný účel toho dotazu je zjistit, jestli řádek splňující podmínku existuje. Viz mimochodec
• Podmínka na ř. 4 v class.LoginUser.php mi nepřipadá správně. Jednak přes isset projde i prázdný řetězec. To může být záměr, ale pak to vyvolává otázku, jaký má ta podmínka vůbec smysl. Hlavně to ale vytváří třetí větev kódu, viz níže.
• Zároveň isset je sice uvnitř metody, ale ne v té ukázce jejího zavolání, takže takhle napsaný kód, pokud nebude jméno anebo heslo vůbec odeslané, bude pořád generovat notice. Resp. z pohledu generování notice to isset uvnitř metody vůbec být nemusí, protože parametry funkce budou vždycky definované (maximálně budou NULL).
• Proč je vlastně návštěvník když zadá třeba chybné heslo přesměrován na index? Nebylo by lepší ho nechat na přihlašovacím formuláři, aby mohl třeba zadat správné heslo?
• Metoda tedy má tři větve: Uživatele přihlásí a dá hlavičku pro přesměrování, uživatele nepřihlásí a dá hlavičku pro přesměrování, nebo neudělá vůbec nic (pokud jméno anebo heslo je NULL). Zjevně očekává, že na tu třetí by měl reagovat ten, kdo metodu volá. Ten přitom nemá žádnou* možnost zjistit, že ta situace vůbec nastala.
Tak jak to je nastíněné v [#1] skript buď přihlásí a nastaví přesměrování, nebo nepřihlásí a nastaví přesměrování, nebo neudělá nic a dál se ve všech případech chová, jako by nebylo zadané jméno anebo heslo. Čili pokud mě prohlížeč automaticky nepřesměruje (třeba protože jsem to vypnul), dostanu pokaždé přihlašovací formulář (i když reálně budu přihlášen).

*Žádnou přijatelnou, samozřejmě může třeba kontrolovat $_SESSION["msg"], ale takový kód by byl chybně navržený

Teoretické chyby v návrhu:
• Celá ta metoda je zadrátovaná do konkrétní situace. Neumím si představit, jak by ji šlo vzít a použít v jiných podmínkách. Přitom znovupoužitelnost má být jeden z hlavních přínosů objektově-orientovaného programování.
• Metoda není zapouzdřená. Sice plusový bod za to, že alespoň vstupy má oddělené, ale viz poslední odrážka předchozího bloku: Metoda očekává, že si to dořeší programátor o úroveň výš, a to aniž by mu k tomu poskytla nějaké informace.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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