Avatar billede chriz7913 Nybegynder
27. maj 2008 - 23:31 Der er 5 kommentarer og
1 løsning

Sikkert login system

hej.
Ville gerne vide om mit loginsystem er sikkert ifølge jer experter :)
=================
<?
session_start();
include "connect.php";
$cookuser = $_SESSION['user'];
$cookpass = $_SESSION['pass'];
$cookid = $_SESSION['id'];
if($_GET[side] == 'nightlife'){$siden = "?side=nightlife";}
if(isset($cookuser)){
header ("location:http://localhost/login/loggetind.php$siden");
}else{
$pass = $_POST["kodeord"];
$user = $_POST["brugernavn"];
$pass = str_replace("'","","$pass");
$user = str_replace("'","","$user");
$user = trim($user);
$user = mysql_real_escape_string($user);
$pass = mysql_real_escape_string($pass);
$tjekuser = strtolower($user);
if(isset($user)){
$db = mysql_query("SELECT * FROM login WHERE brugernavn='$user'");
$vis = mysql_fetch_array($db);
$tjekbruger = strtolower($vis["brugernavn"]);
$usernr2 = $vis['brugernavn'];
$viskodeord = md5($vis[kodeord]);
$mdpass = md5($pass);
if($tjekbruger == $tjekuser && $viskodeord == $mdpass){
if($vis["accepteret"] == 'ja'){
$_SESSION['user'] = $usernr2;
$_SESSION['pass'] = $pass;
$_SESSION['id'] = $vis[id];
mysql_query("UPDATE login SET status = 'Online' WHERE brugernavn='$usernr2'");
$denne_side = "Login > $_SESSION[user] er logget ind";
include "bevaeg.php";
?>
<script type="text/javascript">
top.location.href = "http://localhost/index_ny.php";</script><?}elseif($_POST[brugernavn] != ''){
$ikke_aktiv = "Din bruger er<br>ikke aktiveret";
$denne_side = "Login > $usernr2 forsøger at logge ind, men brugeren er ikke aktiveret";
include "bevaeg.php";}
}else{
$forkert = "Forkert brugernavn<br>eller kodeord";
$denne_side = "Login > $user forsøger at logge ind med $pass";
include "bevaeg.php";}}
?>
================
Ved godt koden er meget rodet
- Hilsen Chris
Avatar billede coderdk Praktikant
28. maj 2008 - 09:20 #1
Ja og nej. Du gemmer brugernes kodeord som klartekst i databasen. Hvis du har andre huller andre steder risikerer du at kompromittere brugernes kodeord. Gem dem i databasen som en md5-hash. Mener du ikke selv at det er nødvendigt er det helt unødvendigt for dig at bruge md5 overhovedet. Du kan blot checke om kodeordene matcher.
Andre kommentarer: Du sætter status til "Online", men hvis brugeren bare lukker browseren er han stadig online indtil han har logget på igen, og logget ud. Et alternativ er at sætte et felt med et tidsstempel, f.eks. "last_activity", og sætte den hver gang brugeren laver noget, og så definere at en bruger er online hvis last_activity er inden for de sidste 5 minutter f.eks.
str_replace er unødvendig da du bruger mysql_real_escape_string...
tjekbruger og strtolower er unødvendig, du henter where brugernavn='$usernr2'
Her er en lidt clean kode ud fra det du har skrevet:

<?

session_start();
include "connect.php";

$cookuser = $_SESSION['user'];
$cookpass = $_SESSION['pass'];
$cookid = $_SESSION['id'];

if(isset( $_GET['side'] ) && $_GET['side'] == 'nightlife')
{
    $siden = "?side=nightlife";
}
if(isset($cookuser))
{
    header ("location:http://localhost/login/loggetind.php$siden");
}
else
{
    $pass = $_POST["kodeord"];
    $user = trim( $_POST["brugernavn"] );
    $user = mysql_real_escape_string($user);
    if(!empty($user))
    {
        $db = mysql_query("SELECT * FROM login WHERE brugernavn='$user'");
        if ( mysql_num_rows( $db ) > 0 )
        {
            $vis = mysql_fetch_array($db);
            if($vis['kodeord'] == $pass)
            {
                if($vis["accepteret"] == 'ja')
                {
                    $_SESSION['user'] = $usernr2;
                    $_SESSION['pass'] = $pass;
                    $_SESSION['id'] = $vis['id'];
                    mysql_query("UPDATE login SET status = 'Online' WHERE id=$vis[id]");
                    $denne_side = "Login > $_SESSION[user] er logget ind";
                    include "bevaeg.php";
?>
<script type="text/javascript">
top.location.href = "http://localhost/index_ny.php";</script><?

                }
                else
                {
                    $ikke_aktiv = "Din bruger er<br>ikke aktiveret";
                    $denne_side = "Login > $usernr2 forsøger at logge ind, men brugeren er ikke aktiveret";
                    include "bevaeg.php";
                }
            }
            else
            {
                $forkert = "Forkert brugernavn<br>eller kodeord";
                $denne_side = "Login > $user forsøger at logge ind med $pass";
                include "bevaeg.php";
            }
        }
    }
}

?>
Avatar billede chriz7913 Nybegynder
28. maj 2008 - 14:57 #2
Tak for de gode råd :)
Kan du hurtigt forklare eller ved du hvor der er nogle gode artikler om "tidsstempel"?
Avatar billede coderdk Praktikant
28. maj 2008 - 15:15 #3
Idéen er blot, at du ved på hver side, checker om brugeren er logget ind (vha din session)- hvis han er, så laver du en hurtig query:

$sql = "UPDATE user SET lastactivity = " . time() . " WHERE userid = " . $_SESSION['id'];

Så definerer du bare, at en bruger er online, hvis han har genereret aktivitet inden for de sidste 5 minutter f.eks.
For at lave en liste over online brugere kan så:

$sql = "SELECT * FROM user WHERE lastactivity >= " . ( time() - 300 );

300 er i sekunder, altså 5 minutter.
Avatar billede chriz7913 Nybegynder
28. maj 2008 - 23:15 #4
OK :) mange tak for det gode eksempel
det prøver jeg at arbejde lidt videre med.
smid et svar d;
Avatar billede coderdk Praktikant
28. maj 2008 - 23:20 #5
ok :) men det sidste jeg skrev var nu et svar :D
Avatar billede chriz7913 Nybegynder
29. maj 2008 - 00:34 #6
doh ;D
Det var mig der var lidt langsom der :D
15 point til coderdk
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