Avatar billede chrisson Nybegynder
21. september 2006 - 15:17 Der er 16 kommentarer og
1 løsning

Sikre login system det bliver hacket hele tiden

Hej exp,

Nogle som er god til at sikre et login system :D?
Kunne i hvert fald bruge en lige nu. Min chat bliver hele tiden hacket igennem mit loginsystem. Det er skide træls, da han sletter alle brugere hver gang!

Her er koden:

<?
session_start();
include("user/include/KaConnect.php");

function HandleLogin($brugernavn, $kodeord)
{

    $db_hent = mysql_query("SELECT * FROM brugeroplysninger WHERE lower(brugernavn) = lower('$brugernavn')");
    $hent = mysql_fetch_assoc($db_hent);

    if (strtolower($hent['brugernavn']) == strtolower($brugernavn) && $hent['password'] == md5($kodeord))
    {
        $_SESSION['loggetind'] = "yes";
        $_SESSION['Brugernavn'] = $hent['brugernavn'];
        $_SESSION['kodeord'] = $hent['kodeord'];
        $_SESSION['Rang'] = $hent['Rang'];
        $_SESSION['status'] = $hent['status'];
        $tid = time();
        $time = time();
        mysql_query("UPDATE brugeroplysninger SET kick = '2', rumid = '1', tjektid = '$time' WHERE brugernavn = '$_SESSION[Brugernavn]'");
        mysql_query("UPDATE brugeroplysninger SET cache = '$time' WHERE brugernavn = '$_SESSION[Brugernavn]'");

        return true;
    }

    return false;
}

if (isset($_COOKIE['brugernavn'], $_COOKIE['kodeord']))
{
    if (HandleLogin($_COOKIE['brugernavn'], $_COOKIE['kodeord']))
    {
        $now = date("d/m-Y H:i");
    }
}
else
if (isset($_POST['brugernavn']) && trim($_POST['brugernavn']) != "")
{
    if (HandleLogin($_POST['brugernavn'], $_POST['password']))
    {
        if ($_POST["auto"] == "yes")
        {
            setcookie("brugernavn", $_POST['brugernavn'], time() + 60*60*24*180);
            setcookie("kodeord", $_POST['password'], time() + 60*60*24*180);
        }
       
        header("Location: KaLogin.php");
    }
    else
    {
        print "Forkert brugernavn/adgangskode!";
    }
}

if ($_SESSION['loggetind'] == "yes")
{
?>

<p>Du er logget ind!</p>
<a href="java script:void(window.open('user/KaFrame.php','frameset','width=790,height=473,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no'))">Åben chatten</a>
<a href="user/include/KaLogud.php">Logud</a><br></td>
<?php
}
else
{
?>
<form name="form1" method="post" action="KaLogin.php">
  <font face="Bodoni MT Condensed">Brugernavn:&nbsp;&nbsp;&nbsp;&nbsp;</font><input type="text" name="brugernavn" size="8">
<br><font face="Bodoni MT Condensed">Adgangskode:</font>
<input type="password" name="password" size="8">
<br>
<input type="submit" name="submit" value="Login">


</form>
<?
}
?>

Håber i kan hjælpe :D
200 points er sat til den / de som hjælper
Avatar billede jakobdo Ekspert
21. september 2006 - 15:47 #1
Du kan lave din SELECT til LIMIT 1
Ligeledes smid sleep(1); ind i din login funktion, så bliver brute-force ikke sjovt længere.
Avatar billede chrisson Nybegynder
21. september 2006 - 16:04 #2
Kan du lave et eksempel?
Avatar billede chrisson Nybegynder
21. september 2006 - 16:06 #3
Men ville det ikke også være mere sikkert, hvis jeg lavede en check om session kryp kode er magen til db kryp kode, eller kan de stadig hacke sig uden om?
Avatar billede jakobdo Ekspert
21. september 2006 - 16:14 #4
Du bruger også variabler direkte fra $_POST['brugernavn'] direkte til din SQL, det er heller ikke godt. :o)
Avatar billede chrisson Nybegynder
21. september 2006 - 16:18 #5
Ok, men kan du vise eksempel på sleep(1);?
Avatar billede chrisson Nybegynder
21. september 2006 - 16:31 #6
Nu har jeg indsat:
$brugernavn= $_POST['brugernavn'];
$kodeord= $_POST['kodeord'];
function HandleLogin($brugernavn, $kodeord)
{
    $db_hent = mysql_query("SELECT * FROM brugeroplysninger WHERE lower(brugernavn) = lower('$brugernavn') LIMIT 1");
    $hent = mysql_fetch_assoc($db_hent);

i toppen
Avatar billede chrisson Nybegynder
21. september 2006 - 16:39 #7
Lille rettelse:

$brugernavn = htmlspecialchars($_POST['brugernavn']);
$kodeord = htmlspecialchars($_POST['kodeord']);
Avatar billede chrisson Nybegynder
21. september 2006 - 16:40 #8
Nu mangler jeg kun den der sleep(1); så køre det
Avatar billede jakobdo Ekspert
21. september 2006 - 16:46 #9
F.eks. noget i stil med:

function HandleLogin($brugernavn, $kodeord)
{
    //Sleep som går bruteforce mindre sjovt.
    sleep(1);
   
    $user = mysql_real_escape_string(strtolower($brugernavn));
    $pass = md5($kodeord);
   
    $db_hent = mysql_query("SELECT * FROM brugeroplysninger WHERE lower(brugernavn) = '$brugernavn' AND kodeord = '$pass' LIMIT 1");
    if(mysql_num_rows($db_hent)==1)
    {
      $hent = mysql_fetch_assoc($db_hent);
        $_SESSION['loggetind'] = "yes";
        $_SESSION['Brugernavn'] = $hent['brugernavn'];
        $_SESSION['kodeord'] = $hent['kodeord'];
        $_SESSION['Rang'] = $hent['Rang'];
        $_SESSION['status'] = $hent['status'];
        $tid = time();
        $time = time();
        mysql_query("UPDATE brugeroplysninger SET kick = '2', rumid = '1', tjektid = '$time' WHERE brugernavn = '$_SESSION[Brugernavn]'");
        mysql_query("UPDATE brugeroplysninger SET cache = '$time' WHERE brugernavn = '$_SESSION[Brugernavn]'");

        return true;
    }
    return false;
}
Avatar billede chrisson Nybegynder
21. september 2006 - 17:06 #10
Får fejl på linie 31:    if(mysql_num_rows($db_hent)==1) og den vil ikke logge ind

Fejl type:

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /customers/kasketten.dk/kasketten.dk/httpd.www/chat/KaLogin.php on line 31
Avatar billede jakobdo Ekspert
21. september 2006 - 18:06 #11
Prøv lige:
$db_hent = mysql_query("SELECT * FROM brugeroplysninger WHERE lower(brugernavn) = '$brugernavn' AND kodeord = '$pass' LIMIT 1") or die(mysql_error());
Avatar billede chrisson Nybegynder
21. september 2006 - 18:18 #12
Nice nok det virker :D Læg svar... Men har du ikke nogle råd med if(!$_SESSION[Brugernavn]) { til at sikre det bedre, men fx. noget med tjek kode fra db.?
Avatar billede jakobdo Ekspert
21. september 2006 - 18:26 #13
Det vil jeg ikke gøre.
Evt. ville jeg lave:
$_SESSION['loggetind'] = "yes";
        $_SESSION['Brugernavn'] = $hent['brugernavn'];
        $_SESSION['kodeord'] = $hent['kodeord'];
        $_SESSION['Rang'] = $hent['Rang'];
        $_SESSION['status'] = $hent['status'];

og så tilføje:
$_SESSION['bruger_ip'] = $_SERVER['REMOTE_ADDR'];

Når du så tjekker om $_SESSION['loggetind'] == 'yes'
så skal du også tjekke om:
$_SERVER['REMOTE_ADDR'] == $_SESSION['bruger_ip']
Avatar billede chrisson Nybegynder
29. september 2006 - 19:18 #14
Tak skal du have, Læg svar
Avatar billede jakobdo Ekspert
30. september 2006 - 15:44 #15
Du får et svar!
Avatar billede jakobdo Ekspert
30. september 2006 - 19:47 #16
Takker for point.
Avatar billede chrisson Nybegynder
30. september 2006 - 20:36 #17
Kan du finde ud af innerhtml eller få chatten til at lade vær med at blinke, måske bare klikke, så hjælp lige plzz på http://www.eksperten.dk/spm/735332
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester