NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
IT rekvalifikace s podporou uplatnění. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!

Diskuze: Systém registrace a přihlášení na webu

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Frunta
Tvůrce
Avatar
Frunta:4.11.2012 10:23

Zdravím.
Mám v plánu na svůj web přidat možnost registrace a přihlášení, vytvořil jsem takovýto systém, ale nevím, zda je bezpečný a neobsahuje závažné chyby. Chtěl bych, abyste nehleděli na detaily, ale na závažné problémy a funkčnost.
S pozdravem, Frunta

 
Odpovědět
4.11.2012 10:23
Avatar
Frunta
Tvůrce
Avatar
Frunta:4.11.2012 10:24

registrace.php

<fieldset>
        <legend>Registrace</legend>
        <form method="POST">
                <table>
                        <tr>
                                <td><label for="jmeno">Jméno: </label></td><td><input class="t" maxlength="25" type="text" name="jmeno" /></td>
                        </tr>
                        <tr>
                                <td><label for="heslo">Heslo: </label></td><td><input class="t" maxlength="25" type="password" name="heslo" /></td>
                        </tr>
                        <tr>
                                <td><label for="heslo">Heslo znovu: </label></td><td><input class="t" maxlength="25" type="password" name="hesloz" /></td>
                        </tr>
                        <tr>
                                <td><label for="email">E-mail: </label></td><td><input class="t" maxlength="25" type="text" name="email" value="@" /></td>
                        </tr>
                        <tr>
                                <td><input class="s" type="submit" value="Registrovat" /></td>
                        </tr>
                </table>
        </form>
</fieldset>
<?php
        if ($_POST["jmeno"] != "" &&
        $_POST["heslo"] == $_POST["hesloz"] &&
        $_POST["heslo"] != "" &&
        $_POST["email"] != "") {
                $pripojeni = mysql_connect("localhost", "root", "");
                mysql_select_db("druha", $pripojeni);

                $sql = "INSERT INTO registrace (jmeno, heslo, email)
                VALUES
                ('$_POST[jmeno]','$_POST[heslo]','$_POST[email]')";

                if (mysql_query($sql, $pripojeni)){
                        echo "
                                <script type='text/javascript'>
                                        alert('Úspěšně zaregistrováno! Nyní je možné se přihlásit.');
                                </script>
                        ";
                }
                mysql_close($pripojeni);
        }
        else if($_POST["heslo"] != $_POST["hesloz"]) {
                echo "<script type='text/javascript'>alert('Hesla poňekud nesouhlasí!');</script>";
        }
        else if($_POST["jmeno"] != "" || $_POST["heslo"] != "" || $_POST["hesloz"] != "" || $_POST["email"] != "") {
                echo "<script type='text/javascript'>alert('Vyplňte všechna pole!');</script>";
        }
?>

prihlasit.php

<fieldset>
        <legend>Přihlásit</legend>
        <form method="POST">
                <table>
                <tr>
                        <td><label for="jmeno">Jméno: </label></td><td><input class="t" maxlength="25" type="text" name="jmeno" /></td>
                </tr>
                <tr>
                        <td><label for="heslo">Heslo: </label></td><td><input class="t" maxlength="25" type="password" name="heslo" /></td>
                </tr>
                <tr>
                        <td><input class="s" type="submit" value="Přihlásit" /></td>
                </tr>
                </table>
        </form>
</fieldset>
<?php
        $pripojeni = mysql_connect("localhost","root","");
        mysql_select_db("druha", $pripojeni);

        $vysledek = mysql_query("SELECT * FROM registrace
        WHERE jmeno='$_POST[jmeno]' AND heslo='$_POST[heslo]'");

        if($tt = mysql_fetch_array($vysledek)) {
                $prihlaseno = $tt['jmeno'];
                session_start();
                $_SESSION["prihlaseno"] = $prihlaseno;
                session_write_close();
                echo "<script type='text/javascript'>alert('Úspěšně přihlášeno!');</script>";
        }
        else if($_POST['jmeno'] != "" || $_POST['heslo'] != "") echo "<script type='text/javascript'>alert('Jméno nebo heslo bylo napsáno špatně přihlášeno!');</script>";

        mysql_close($pripojeni);
?>

odhlasit.php

<?php
        session_start();
        session_unset();
        session_write_close();
        header("Location: index.php?stranka=domov");
?>

index.php lišta s přihlášením

<?php
                                                session_start();
                                                if ($_SESSION["prihlaseno"] != "") {
                                                        echo "Přihlášeno jako: ".$_SESSION["prihlaseno"]." | <a href='?stranka=odhlasit'>odhlásit</a>";
                                                }
                                                else echo "<a href='?stranka=registrace'>Registrace</a> |
                                                <a href='?stranka=prihlasit'>Přihlásit</a>";
                                                session_write_close();
                                        ?>
Editováno 4.11.2012 10:25
 
Nahoru Odpovědět
4.11.2012 10:24
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Frunta
David Hartinger:4.11.2012 14:06

Ukládat heslo do databáze je velmi, velmi špatný nápad. Hesla se ukládají jen jako tzv. otisk, ze kterého původní heslo získat nelze. Když uživatel zadá heslo, udělá se jeho otisk a ten se porovná s otiskem v databázi. Pokud souhlasí, je heslo správné. Otisku se říká hash, v PHP existuje stejnojmenná funkce, je popsaná ve zdejším manuálu: http://www.itnetwork.cz/…y-php-manual

Kdyby ti nebylo něco jasné, tak se ptej :)

Nahoru Odpovědět
4.11.2012 14:06
New kid back on the block with a R.I.P
Avatar
Frunta
Tvůrce
Avatar
Frunta:4.11.2012 14:35

Děkuji, takže když to spravím, bude to použitelné?

 
Nahoru Odpovědět
4.11.2012 14:35
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Frunta
David Hartinger:4.11.2012 14:37

Teď jsem si všiml, že vůbec neescapuješ hodnoty co vkládáš do databáze. Přeci nemůžeš dělat tohle:

$sql = "INSERT INTO registrace (jmeno, heslo, email)
                VALUES
                ('$_POST[jmeno]','$_POST[heslo]','$_POST[email]')";

Podívej se do sekce PHP na článek o SQL injekci, je to dost nebezpečné.

Nahoru Odpovědět
4.11.2012 14:37
New kid back on the block with a R.I.P
Avatar
Frunta
Tvůrce
Avatar
Frunta:4.11.2012 15:03
$sql = "INSERT INTO registrace (jmeno, heslo, email) VALUES
        ('%s','%s','%s')";
mysql_real_escape_string($_POST['jmeno']),
mysql_real_escape_string($_POST['heslo']),
mysql_real_escape_string($_POST['email']);

Takto přibližně?

Editováno 4.11.2012 15:06
 
Nahoru Odpovědět
4.11.2012 15:03
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Frunta
David Hartinger:4.11.2012 17:30

Jo, nějak takto :) To musí být všude, kde jde do querystringu nějaká proměnná, pokud to někde jinde na webu nemáš, tak si to rychle oprav.

Nahoru Odpovědět
4.11.2012 17:30
New kid back on the block with a R.I.P
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Frunta
Kit:4.11.2012 17:31

V této podobě ti to sice fungovat nebude, ale je to na dobré cestě.

Nahoru Odpovědět
4.11.2012 17:31
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Frunta
David Hartinger:4.11.2012 17:35

Aha, jsem to nějak přehlédl. Vidím, že tutoriály sis asi nepřečetl...

Nahoru Odpovědět
4.11.2012 17:35
New kid back on the block with a R.I.P
Avatar
Frunta
Tvůrce
Avatar
Frunta:4.11.2012 18:04

Zdejší PHP tutoriály jsem nečetl, kromě tohoto: http://www.itnetwork.cz/…y-php-manual

 
Nahoru Odpovědět
4.11.2012 18:04
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Frunta
David Hartinger:4.11.2012 18:10

Možná by to byl dobrý nápad ;-)

Nahoru Odpovědět
4.11.2012 18:10
New kid back on the block with a R.I.P
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 11 zpráv z 11.