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

PHP PHP Systém registrace a přihlášení na webu American English version English version

Avatar
Frunta
Redaktor
Avatar
Frunta:

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
Redaktor
Avatar
Frunta:

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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Frunta
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Frunta
Redaktor
Avatar
Frunta:

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

 
Nahoru Odpovědět 4.11.2012 14:35
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Frunta
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Frunta
Redaktor
Avatar
Frunta:
$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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Frunta
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Frunta
Kit:

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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Frunta
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Frunta
Redaktor
Avatar
Frunta:

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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Frunta
David Čápka:

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

Nahoru Odpovědět 4.11.2012 18:10
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
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.