Op deze website gebruiken we cookies om content en advertenties te personaliseren, om functies voor social media te bieden en om ons websiteverkeer te analyseren. Ook delen we informatie over uw gebruik van onze site met onze partners voor social media, adverteren en analyse. Deze partners kunnen deze gegevens combineren met andere informatie die u aan ze heeft verstrekt of die ze hebben verzameld op basis van uw gebruik van hun services. Meer informatie.

Akkoord

Vraag & Antwoord

Webprogrammeren & scripting

PHP Veilig login script

teacher
8 antwoorden
  • Ik ben voor mijn project bezig met een login script. Dit wil ik uiteraard zo veilig mogelijk maken. Ik ben echter nog niet echt thuis is het veilig scripten en ben bang dat ik het juist erg onveilig ga doen.
    Ik heb hier en daar wat over secure logins gelezen en heb begrepen dat het erg verstandig is usernames en passwords zowieso te encrypten. Dit kan blijkbaar d.m.v. md5 en sha1 encryptie. Is het echter ook mogelijk om deze beiden toe te passen? Dus op deze manier bijvoorbeeld:
    [code:1:d6cab445c3]
    $password = md5($_POST['password'];
    $password = sha1($password);
    [/code:1:d6cab445c3]

    Het project moet een soort van board gaan worden - vrij uitgebreid dus - , vandaar dat ik jullie al een aantal vragen heb gesteld. Stel dat ik de gebruikers op deze manier laat inloggen, is dit dan veilig genoeg?
    [code:1:d6cab445c3]
    <?php
    //login.php

    if ((!isset($_POST['username'])) || (!isset($_POST['password']))) {
    echo "
    <form action=\"login.php\" method=\"post\">
    <input type=\"textfield\" maxlength=15 name=\"username\" /><br />
    <input type=\"textfield\" maxlength=15 name="password" /><br />
    <input type=\"submit\" name=\"submit\" /> <input type=\"checkbox\" value=1 name=\"cookie\" />
    </form>
    ";
    }
    elseif ((isset($_POST['username'])) && (isset($_POST['password'])) $$ isset($_POST['submit'])) {
    function mksecure($var) {
    $var = htmlentities($var);
    $var = mysql_real_escape_string($var);
    $var = strip_slashes($var);
    $var = strip_tags($var);
    $var = md5($var);
    return $var;
    }

    $username = @mksecure($_POST['username']);
    $password = @mksecure($_POST['password']);
    $cookie = @htmlentities($_POST['cookie']);

    // Database connectie maken
    include "dblink.php";

    $query = "SELECT * FROM users WHERE (username='$username') AND (password='$password') LIMIT 1";
    $result = @mysql_query($query) or die("<br />Fout bij inloggen<br />");
    $match = @mysql_num_rows($result);
    $get = @mysql_fetch_array($result);

    if (($match == 1) && ($username == $get['username']) && ($password == $get['password'])) {
    @setcookie ("username", $username), $time+3200);
    @setcookie ("password", $password), $time+3200);
    $httpreferer = $_SERVER['HTTP_REFERER'];
    $time = date(h:i:s);
    $date = date(d-m-Y);
    $ip = @getenv("REMOTE_ADDR");
    $query2 = "UPDATE users SET ((lastlogintime='$time') AND (lastlogindate='$lastlogindate') AND (referer='$httpreferer') AND (ip='$ip') WHERE ((username='$username') AND (password='$password'))";

    header("Location: index.php");
    }
    else {
    echo "U kon niet worden ingelogd.";
    }

    mysql_close();

    }

    ?>
    [/code:1:d6cab445c3]
    Het script is zo nog erg incompleet maar ik vraag me af hoe ik het goed af kan maken nadat het script heeft herkend dat de username en password overeenkomen, en, is dit een goed begin?
    Kan iemand mij daarnaast uitleggen wat de functies en de voordelen van sessies zijn bij een inlogscript? Dat heb ik nooit goed begrepen…

    Alvast bedankt weer!
  • Als ik snel even door de code heen lees, wil je dus cookies zetten met username en password. En die dus elke keer verzenden. Niet echt veilig. Ik zou zelf na inloggen een sessie aanmaken, daarvan een cookie plaatsen, en die elke keer op geldigheid checken. Kun je nog wat aanscherpen met een ip check. Wil je het nog een slag veiliger maken, dan kun je de user/pass verzenden via een https verbinding. Maar daar moet je server dan wel in voorzien.
  • Hoe zou jij dat dan aanpakken, als je met sessies zou werken? Welke sessie variabelen kan je dan het beste gebruiken?
    Verder snap ik niet helemaal wat je hiermee bedoeld:
    [quote:bc698da3c8="gerben"]
    (..)daarvan een cookie plaatsen, en die elke keer op geldigheid checken.
    [/quote:bc698da3c8]

    //Edit:
    Ik heb het script inmiddels al wat aangepast en geintegreerd in de rest van de code. Nu heb ik dit:
    [code:1:bc698da3c8]
    <?php

    if ((!isset($_POST['username'])) || (!isset($_POST['password']))) {
    echo "
    <p>
    <form action=\"login.php\" method=\"post\">
    <table width=400 border=0 align=\"center\" cellpadding=0 cellspacing=0>
    <tr>
    <td width=125 class=\"sub\">Username</td>
    <td align=\"left\" valign=\"middle\" class=\"top\"><label>
    <input type=\"text\" name=\"username\" style=\"width:100%;\" />
    </label></td>
    </tr>
    <tr>
    <td width=125 class=\"sub\">Password</td>
    <td align=\"left\" valign=\"middle\" class=\"top\"><label>
    <input type=\"password\" name=\"password\" style=\"width:100%;\" />
    </label></td>
    </tr>
    <tr>
    <td width=125 class=\"top\"><a href=\"#\"><img src=\"static/images/help_icon.gif\" alt=\"Help\" width=16 height=16 border=0 /></a></td>
    <td class=\"top\">
    <input type=\"submit\" name=\"submit\" value=\"Login\" /> <label>
    <input type=\"button\" name=\"cancel\" value=\"Cancel\" onclick=\"location.href='index.php'\" />
    </label>
    <label>
    <input type=\"checkbox\" name=\"cookie\" value=1 /> Remember me</label>
    </td>
    </tr>
    </table>
    </form>
    </p>
    ";
    }
    elseif ((isset($_POST['username'])) && (isset($_POST['password'])) && isset($_POST['submit'])) {

    $username = @basicfilter($_POST['username']);
    $password = @mksecure($_POST['password']);
    $cookie = @htmlentities($_POST['cookie']);

    $query = "SELECT * FROM users WHERE ((username='$username') AND (passwordmd5='$password')) LIMIT 1";
    $result = mysql_query($query) or die("<br /><center>Login error. Please report to board administrator.<br />");
    $match = mysql_num_rows($result);
    $get = mysql_fetch_array($result);
    if (($match == 1)) {
    $httpreferer = $_SERVER['HTTP_REFERER'];
    $time = date("h:i:s");
    $date = date("d-m-Y");
    $ip = @getenv("REMOTE_ADDR");
    $timesloggedin = $get['xlogin'];
    $newtimes = $timesloggedin++;
    $query2 = "UPDATE users SET ((lastlogintime='$time') AND (lastlogindate='$lastlogindate') AND (referer='$httpreferer') AND (ip='$ip') AND (xlogin='$newtimes')) WHERE ((username='$username') AND (password='$password'))";
    //Regel 98
    session_start();
    $_SESSION['loggedin'] = "true";
    $_SESSION['username'] = $username;
    $_SESSION['password'] = $password;
    $_SESSION['ip'] = $ip;
    echo "<strong>You are logged in.</strong> Please wait 3 seconds.";
    echo "<meta http-equiv=\"refresh\" content=\"3;URL=index.php\" />";
    }
    else {
    echo "U kon niet worden ingelogd.";
    }
    }

    ?>
    [/code:1:bc698da3c8]
    Maar als ik nu inlog geeft het script de volgende error:
    [code:1:bc698da3c8]
    Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\Program Files\Wamp\www\Board\login.php:6) in C:\Program Files\Wamp\www\Board\login.php on line 98

    Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\Program Files\Wamp\www\Board\login.php:6) in C:\Program Files\Wamp\www\Board\login.php on line 98
    U bent ingelogd. Wacht 3 seconden a.u.b.
    [/code:1:bc698da3c8]
    Nogmaals - ik ben nieuw op het gebied van sessies, ik weet er erg weinig vanaf. Wat doe ik fout?
  • je moet sessies altijd aan het begin van de pagina zetten. nog voor <html>. zoals hij aangeeft: [code:1:2a19c162d8]headers already sent [/code:1:2a19c162d8]

    Peter
  • Als teacher dalijk weer langs komt met zijn "ob_start": negeren ;)
  • Ik heb session_start() bovenaan het script geplaatst en nu is de error inderdaad verdwenen.
    Nu heb ik echter een ander probleem: Ik heb dit uitlog script gemaakt, maar als je uitlogd, zijn op die pagina zelf inderdaad alle sessies weg, maar op alle andere pagina's bestaan ze gewoon nog… Wat doe ik hier fout?
    [code:1:f8ddb1ac2d]
    //login.php

    <?php
    if (!isset($_SESSION['loggedin']) && ($_GET['action'] !== "logout")) { session_start(); } elseif ((isset($_SESSION['loggedin'])) && ($_GET['action'] == "logout")) {
    unset($_SESSION['loggedin']);
    unset($_SESSION['username']);
    unset($_SESSION['password']);
    unset($_SESSION['ip']);
    session_destroy();
    } ?>

    <?php
    echo $_SESSION['loggedin'];
    echo $_SESSION['username'];

    if (((!isset($_POST['username']) || !isset($_POST['password'])) || (isset($_SESSION['loggedin']) && ($_GET['action'] == "logout")))) {
    if ((!isset($_SESSION['loggedin'])) && ($_GET['action'] == "logout")) {
    echo "<p><center><span class=\"commonmargin\">You have been logged out</span></center></p>";
    }
    echo "
    <p>
    <form action=\"login.php\" method=\"post\">
    <table width=400 border=0 align=\"center\" cellpadding=0 cellspacing=0>
    <tr>
    <td width=125 class=\"sub\">Username</td>
    <td align=\"left\" valign=\"middle\" class=\"top\"><label>
    <input type=\"text\" name=\"username\" style=\"width:100%;\" />
    </label></td>
    </tr>
    <tr>
    <td width=125 class=\"sub\">Password</td>
    <td align=\"left\" valign=\"middle\" class=\"top\"><label>
    <input type=\"password\" name=\"password\" style=\"width:100%;\" />
    </label></td>
    </tr>
    <tr>
    <td width=125 class=\"top\"><a href=\"#\"><img src=\"static/images/help_icon.gif\" alt=\"Help\" width=16 height=16 border=0 /></a></td>
    <td class=\"top\">
    <input type=\"submit\" name=\"submit\" value=\"Login\" /> <label>
    <input type=\"button\" name=\"cancel\" value=\"Cancel\" onclick=\"location.href='index.php'\" />
    </label>
    <label>
    <input type=\"checkbox\" name=\"cookie\" value=1 /> Remember me</label>
    </td>
    </tr>
    </table>
    </form>
    </p>
    ";
    }
    elseif (isset($_SESSION['loggedin']) && !isset($_POST['username'])) {
    echo "<p><center><span class=\"commonmargin\">You are allready logged in. <input type=\"button\" value=\"Logout\" onclick=\"location.href='login.php?action=logout'\" style=\"font-size:11px;\" /></span></center></p>";
    }
    elseif ((isset($_POST['username'])) && (isset($_POST['password'])) && isset($_POST['submit'])) {

    $username = @basicfilter($_POST['username']);
    $password = @mksecure($_POST['password']);
    $cookie = @htmlentities($_POST['cookie']);

    $query = "SELECT * FROM users WHERE ((username='$username') AND (passwordmd5='$password')) LIMIT 1";
    $result = mysql_query($query) or die("<br /><center>Login error. Please report to board administrator.<br />");
    $match = mysql_num_rows($result);
    $get = mysql_fetch_array($result);
    if (($match == 1)) {
    $httpreferer = $_SERVER['HTTP_REFERER'];
    $time = date("h:i:s");
    $date = date("d-m-Y");
    $ip = @getenv("REMOTE_ADDR");
    $timesloggedin = $get['xlogin'];
    $newtimes = $timesloggedin++;
    $query2 = "UPDATE users SET ((lastlogintime='$time') AND (lastlogindate='$lastlogindate') AND (referer='$httpreferer') AND (ip='$ip') AND (xlogin='$newtimes')) WHERE ((username='$username') AND (password='$password'))";
    $_SESSION['loggedin'] = "true";
    $_SESSION['username'] = $username;
    $_SESSION['password'] = $password;
    $_SESSION['ip'] = $ip;
    echo "<p><center><span class=\"commonmargin\">U bent ingelogd.</strong> Wacht 3 seconden.
    Niet genoeg geduld? <a href=\"index.php\" title=\"Ga verder\">Klik hier om verder te gaan</a>.</span></center></p>";
    echo "<meta http-equiv=\"refresh\" content=\"3;URL=index.php\" />";
    }
    else {
    echo "U kon niet worden ingelogd.";
    }

    }
    ?>
    [/code:1:f8ddb1ac2d]
    Vervolgens heb ik op iedere pagina als login check dit script gemaakt:
    [code:1:f8ddb1ac2d]
    if (!isset($_SESSION['loggedin']) || $_SESSION['loggedin'] !== "true")
    {
    // uit te voeren code wanneer ingelogd
    }
    [/code:1:f8ddb1ac2d]
    Maar het probleem is dus, dat als je uitlogd, dat je op login.php dan ook daadwerkelijk uitgelogd bent, maar op de rest van de pagina's niet.. als ik op de rest van de pagina's echo $_SESSION['username']; aanroep, krijg ik gewoon de username te zien….
  • wat dan als je de gebruiker naar het uitloggen even doorverwijst ?

    want bij mij is dit stukje code voldoende om uit teloggen
    [code:1:5006eba5c1]
    if($_SESSION['login'] == false){
    echo("U nog niet ingelogd");
    include("login_form.php");
    }else{
    session_destroy();
    header("Location: index.php");
    }
    [/code:1:5006eba5c1]

    [edit]
    verander de bovenste code(die van jou) eens in dit:
    [code:1:5006eba5c1]
    <?php
    if (!isset($_SESSION['loggedin']) && ($_GET['action'] !== "logout")) {
    session_start();
    } elseif ((isset($_SESSION['loggedin'])) && ($_GET['action'] == "logout")) {
    session_start();
    unset($_SESSION['loggedin']);
    unset($_SESSION['username']);
    unset($_SESSION['password']);
    unset($_SESSION['ip']);
    session_destroy();
    } ?>

    [/code:1:5006eba5c1] als je geen sessie hebt gestart, kan je hem ook neit verwijderen lijkt mij
  • [quote:490d5f3081="Bill Gates"]Als teacher dalijk weer langs komt met zijn "ob_start": negeren ;)[/quote:490d5f3081]LOL! :D

    - Bas

Beantwoord deze vraag

Dit is een gearchiveerde pagina. Antwoorden is niet meer mogelijk.