Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

Soutěž: Machr na PHP - Registrace, přihlašování

Soutěž již skončila

Zadání

Vaším úkolem v této soutěži bude vytvořit jednoduchou stránku a přidat na ní registrační formulář. Po registraci bude třeba účet aktivovat pomocí odkazu zaslaného na email. K tomu přidáte možnost přihlášení pro zaregistrované (a aktivované) účty + možnost obnovení hesla pomocí emailu.
Během vyplňování registračního formuláře budete pomocí JavaScriptu kontrolovat platnost vyplňovaných údajů (jako např. jak je dlouhé heslo, zda se shoduje s potvrzením hesla, jestli uživatel nezadal místo emailu nějaký nesmysl...)
Hodnotit budu kód (JavaScript i PHP) a funkčnost (zda vše funguje jak má, jestli stránka nevyhodí nějakou chybu) - a to půl na půl.
Maximum je sto bodů.
K JavaScriptu můžete použít čistou jQuery. Jakékoli jiné knihovny a frameworky jsou zakázány.

Výhra

Vítěz dostane placku Machr, a ocenění do portfolia.

Výhra

Výsledky

Jméno bodů Řešení ( Stáhnout vše )
Matúš Petrofčík 99 Stáhnout řešení
VitekST 88 Stáhnout řešení
Jan Lupčík 80 Stáhnout řešení
Martin Štěpánek 72 Stáhnout řešení
Eda Stehlík 22 Stáhnout řešení
Patrik Neumann 5 Stáhnout řešení
Aktivity
Avatar
Zdeněk Pavlátka:16.6.2016 18:46

Díky všem za účast, zde jsou výsledky:

Eda Stehlík - 22 bodů
Kód: 20 bodů
O komentářích jsi asi v životě neslyšel, nemáš tam jediný. Kód není naformátovaný.
Na konec souborů, které obsahují čistě PHP, není třeba dávat ?>
Ve funkci registruj máš hodně vnořených podmínek. Takhle to je ještě relativně čitelné (i když NetBeans si stěžuje), ale představ si, že bys tam potřeboval přidat dalších třeba 5 podmínek... Katastrofa. Lepší je psát podmínky pod sebe a v nějaké proměnné si ukládat, zdali byly všechny splněny. Např. takhle:

$splneno = true;

if (!/* kontrola jména */) {
        // něco je špatně
        $zprava = "Zadali jste neplatné jméno!"; // ideálně by tam měly být různé hlášky podle toho, co je špatně
        $splneno = false;
}
if (!/* kontrola emailu */) {
        // ...
        $splneno = false;
}
// atd...

if ($splneno) {
        // všechny podmínky byly splněny
}

Javascript chybí úplně.

Funkčnost, použitelnost: 0 bodů
Nemáš tam index.php, takže stránky nelze spustit...

Zabezpečení: 2 body

Hashuješ pomocí SHA1, což je velmi slabý algoritmus. Sůl sice používáš, ale vždy stejnou.

Martin Štěpánek - 72 bodů
Kód: 30 bodů
Kód není nejhorší (ačkoli není moc objektový), komentovaný je celkem dobře.
Dodám jen drobnou radu:
místo kódu

<?php
if ($_SESSION['overeni'] == 'ne') {
        echo('Nemáš ještě ověřený mail. <a href="index.php?znovuzasli=ano">Znovu zaslat ověřovací mail.</a>');
} else {
        echo('Úspěšně jsi se registroval a přihlásil.<br>');
        echo('Jsi přihlášen jako '.$_SESSION['mail']);
}
?>

lze použít tohle:

<?php if ($_SESSION['overeni'] == 'ne'): ?>
        Nemáš ještě ověřený mail. <a href="index.php?znovuzasli=ano">Znovu zaslat ověřovací mail.</a>
<?php else: ?>
        Úspěšně jsi se registroval a přihlásil.<br>
        Jsi přihlášen jako <?= $_SESSION['mail'] ?>
<?php endif; ?>

Funkčnost: 40 bodů
Nenašel jsem žádný problém.

Zabezpečení: 2 body
Hashuješ pomocí SHA1, což je velmi slabý algoritmus. Sůl sice používáš, ale vždy stejnou.

Matúš Petrofčík - 99 bodů
Kód: 40 bodů
Kód je objektový, komentovaný a přehledný.

Funkce validateName má poněkud divné chybové hlášky - někde mluvíš o jméně, někde o hesle.

Funkčnost, použitelnost: 40 bodů
Nenašel jsem žádný problém.

Zabezpečení: 19 bodů

Hesla hashuješ pomocí SHA512, používáš sůl. Super. Jednodušší by ale bylo použít funkci password_hash, která je k tomuhle určená a hash provádí vícekrát po sobě. (navíc se snadno používá)

VitekST - 88 bodů
Kód: 38 bodů
Krásný kód, jen těch komentářů tam moc není.

Funkčnost, použitelnost: 30 bodů
U registrace by měl být odkaz na přihlášení, U přihlášení by měl být odkaz na registraci a obnovu hesla. Nebo alespoň odkaz na úvodní stránku. Takhle když kliknu na některou z možností, dostanu se zpět jen přepsáním url. Totéž platí po aktivaci.
Pokud se nepodaří odeslat email, přesměruje mě stránka zpět na registraci, ať to zkusím znovu, ačkoli účet už je v databázi vytvořen - tím se použité uživatelské heslo zablokuje.

Zabezpečení: 20 bodů

Používáš password_hash - výborně.

Patrik Neumann - 5 bodů
Kód: 2 body
Error 404: Komentáře nenalezeny...
Kód je katastrofální, neobjektový, používáš superglobální pole, aniž by sis zkontroloval zda v něm něco je, používáš $_SESSION aniž bys předtím zavolal session_start().
PHP kód máš vložený dovnitř html místo na začátek souboru, kvůli tomu ti nefunguje přesměrování.
Nemáš ukončenou polovinu html tagů.
Údaje pro připojení k databázi máš v každém souboru spolu s kódem pro připojení.
Pro každou aktivaci účtu generuješ nový php soubor.
Pročti si zdejší články, je to tam pěkně vysvětlené.

Funkčnost, použitelnost: 3 body
Vyhazuje to hromadu chyb.
Po registraci se nikde neobjeví upozornění, že je třeba účet aktivovat.
Přihlášení nefunguje.

Zabezpečení: 0 bodů
Hashovací algoritmy SHA1 a md5 jsou jedny z nejslabších, radši použij password_hash. Navíc tam máš konstantní sůl.
Nemáš ochranu proti SQL Injection -> kdokoli se ti může nabourat do databáze. Cokoli co vkládáš do SQL dotazu musíš ošetřit. Nebo můžeš použít PDO, které to udělá za tebe.

[me|]13944[/me|] - 80 bodů
Kód: 30 bodů
Komentáře tam občas jsou, ale nějak moc jich není, často popisují to, co je již jasné z názvu funkce.
Na konec souborů, které obsahují čistě PHP, není třeba dávat ?>
Třídy by měly být ve vlastních souborech, máš tam dost funkcí mimo třídy.
Jinak kód není špatný.

Pozn.: Nějak jsi mi zapomněl říct, jak má vypadat databáze, musel jsem to hledat v SQL dotazech...

Funkčnost, použitelnost: 30 bodů
Na hostingu ti to hází chybu při registraci (něco s databází).
Možnosti Registrace, Login a Logout by se měly zobrazovat podle toho, jestli je člověk přihlášený, ne vždy všechny. Navíc by asi měly být ve stejném jazyce...
Po registraci se nikde neobjeví upozornění, že je třeba účet aktivovat, uživatel se pak může divit, že se nelze přihlásit.
Jinak to funguje dobře.

Zabezpečení: 20 bodů

Používáš password_hash - výborně.

Jan Lupčík - 80 bodů
Kód: 35 bodů
Kód je pěkně komentovaný, objektový.
U metody Db.update máš výchozí hodnoty parametrů, ale parametry s výchozí hodnotou nemáš na konci. Platí pravidlo, že pokud má parametr výchozí hodnotu, mají ji mít i všechny za ním.
V PHP je lepší emaily validovat pomocí filter_var($email, FILTER_VALIDA­TE_EMAIL)

Nechápu, proč používáš 2 tabulky. Aktivační token máš v obou a jestli je účet aktivovaný máš v tabulce user také. Ta druhá je tam tedy úplně zbytečně.

Funkčnost, použitelnost: 30 bodů
Při obnově hesla posíláš jeho hash, ne heslo samotné. Tudíž se pak nelze přihlásit. Jinak vše funguje dobře, chválím možnost trvalého přihlášení.
Co se týče kontroly emailu:
[a-zA-Z.0-9 **** -_]+@[a-zA-Z0-9]+\.[a-z]{2,6}
Zpětné lomítko v emailu být nesmí, jinak nevím co ti na tom nefunguje.
JavaScriptová kontrola se neaktivuje při použití ctrl+v.

Zabezpečení: 15 bodů

Sůl by měla být různá pro jednotlivé účty, ne konstantní. Lepší by bylo k hashování použít funkci password_hash, která si sůl vytvoří sama.

Placku tedy získává Matúš Petrofčík Gratuluji :)

Odpovědět
16.6.2016 18:46
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Jan Lupčík
Tvůrce
Avatar
Jan Lupčík:16.6.2016 19:10

Matúš Petrofčík: já ti psal, že vyhraješ. :D Gratuluji, opravdu sis to zasloužil - výborná práce prostě! :)

Jinak díky za hodnocení, škoda toho čekání ale. A to zpětné lomítko - nejedná se o neutralizaci nějakého znaku? Už si to nepamatuji. :D

Nahoru Odpovědět
16.6.2016 19:10
TruckersMP vývojář
Avatar
Martin Konečný (pavelco1998):16.6.2016 19:42

Dovolim si jen přidat videonávod k těm, co používají Exceptions:
https://www.youtube.com/watch?…

Nahoru Odpovědět
16.6.2016 19:42
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Jan Lupčík
Zdeněk Pavlátka:16.6.2016 19:51

Jedná, ale ne v hranatých závorkách.

Nahoru Odpovědět
16.6.2016 19:51
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
VitekST
Člen
Avatar
VitekST:16.6.2016 20:47

Nikdo není dokonalý, ani já ne.
Gratuluji výherci. :)

 
Nahoru Odpovědět
16.6.2016 20:47
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Jan Lupčík:16.6.2016 21:11

I tam. Jak by jsi tam chtěl uvést např. znak '-'? :)

Nahoru Odpovědět
16.6.2016 21:11
TruckersMP vývojář
Avatar
Odpovídá na Jan Lupčík
Zdeněk Pavlátka:16.6.2016 22:23

To on tam právě měl, koukám že v hodnocení se to špatně zobrazilo:

[a-zA-Z.0-9\-_]

ale akceptovalo to jak -, tak i \

Nahoru Odpovědět
16.6.2016 22:23
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar

Člen
Avatar
Odpovídá na Zdeněk Pavlátka
:16.6.2016 22:45

Teď na to koukám, že to na hostingu nefunguje. Já totiž v zaslaném řešení prvně poslal i hesla na DB hostingu. Heslo jsem proto změnil, ale script jsem zapomněl doopravit, protože jsem to měl dávno otestované.

Vlastní leností jsem se připravil o pár bodů, ale s tím jsem počítal.
Díky za podrobné hodnocení. Tato zpětná vazba se mi hodí :)

Ps: proč považuješ psaní ukončovacích znaků ?> v souborech pouze s funkcionalitou za "chybu"?

Editováno 16.6.2016 22:46
 
Nahoru Odpovědět
16.6.2016 22:45
Avatar
Odpovídá na Zdeněk Pavlátka
Matúš Petrofčík:16.6.2016 22:49

Dík za hodnotenie a ostatním za účasť :)

K môjmu zadaniu: Tuník mi cez hangouts ešte vytkol, že mám validáciu v AuthModel-i, no lepšie by bolo ak by bola samostatne a kontrolovalo sa to už v Controller-i, a až potom by sa volali metódy AuthModel-u.

K tomu reguláru čo tu riešite. Podľa pcre(php) ak je v zátvorkách pomlčka, netreba ju exitovať (tak sa tomu vraví?), dôkaz v obrázku podľa "regex101.com"https:/­/regex101.com kde si bežne skúšam regulárne výrazy a odporúčam aj ostatným. U JavaScriptu je to ale inak.

Nahoru Odpovědět
16.6.2016 22:49
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na
Matúš Petrofčík:16.6.2016 22:52

proč považuješ psaní ukončovacích znaků ?> v souborech pouze s funkcionalitou za "chybu"?

Pretože ak sa jedná čisto o PHP súbor, tak by sa za ?> mohol objaviť nejaký "biely znak", napr. nový riadok, a to by odoslalo http hlavičku prehliadaču (pretože by sa snažilo ten biely znak vypísať/vygene­rovať). No a to je problém, pretože potom nemôžeme napríklad poslať inú hlavičku (iný stavový kód, napr. 404, alebo presmerovanie).

Nahoru Odpovědět
16.6.2016 22:52
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na Matúš Petrofčík
Matúš Petrofčík:16.6.2016 22:53

Oj ten link tam! Tu je správne regex101.com

Nahoru Odpovědět
16.6.2016 22:53
obsah kocky = r^2 ... a preto vlak drnká
Avatar

Člen
Avatar
Odpovídá na Matúš Petrofčík
:16.6.2016 23:03

Díky, "bílý znak" se mi ještě nepodařilo přifařit, tak jsem o tomto úskalí dosud nevěděl. Dobré vědět. Já ten kód chtěl mít hezký, teď alespoň ušetřím cca 3 znaky na soubor :D

 
Nahoru Odpovědět
16.6.2016 23:03
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 12 zpráv z 62.