Avatar billede eds Nybegynder
20. januar 2009 - 14:57 Der er 3 kommentarer

Loginsystem og sikkerhed

Hej. Jeg er i færd med at lave mit eget bruger system. Men da det er første gang jeg roder med sådan noget, tænkte jeg at jeg hellere måtte forhøre mig lidt om, hvorledes jeg forhindrer uvedkommende i at komme ind.
Jeg har følgende login-side:

<?php
include("connect.php");
include("config.php");
$username = $_POST[username];
$getpassword = $_POST[password];
$password = md5($zzzzzzzz.$getpassword);

$query = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password'");
if ($row = mysql_fetch_assoc($query))
{
session_start();
$_SESSION['loginname'] = $row['username'];
$_SESSION['loginfirst'] = $row['firstname'];
$_SESSION['loginlast'] = $row['lastname'];
$_SESSION['id'] = $row['id'];
echo "Du er nu logget ind som ";
echo $_SESSION['loginname'];
}
else
{
echo "Brugernavn eller kodeord er forkert.";
}
?>

hvor $zzzzzzzz er mit salt.

Jeg har dog indset at denne kode kan være problematisk, hvis nogen opsnapper brugerens session-id. Hvordan sikrer jeg mig mod dette? Jeg overvejede lidt at gemme brugerens ip-adresse i en variabel, og hvis denne ændrer sig så bare dræbe min session. Er dette på nogen måde tæt på at være skudsikkert? Er der evt. andre måder at sikre sig mod at uvedkommende får adgang?

På forhånd tak.
Avatar billede jakobdo Ekspert
20. januar 2009 - 16:50 #1
Du bør escape $_POST['username'], f.eks. med mysql_real_escape_string()
Ligeledes bør du smide en LIMIT 1 på, som her:
$query = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password' LIMIT 1");

En anden ting jeg godt kan lide at smide med i session, er ip, som f.eks.:

$_SESSION['loginip'] = $_SERVER['REMOTE_ADDR'];
Og samtidig med at tjekke om session er ok, også tjekker om IP er = $_SERVER['REMOTE_ADDR'], hvilket jeg vil mene er ekstra sikkerhed mod session hijacking.
Avatar billede eds Nybegynder
20. januar 2009 - 17:09 #2
Okay jeg har nu brugt mysql_real_escape_string() på både kodeord og brugerbavb, tilføjet en limit på 1.
Desuden gemmer den også ip i sessionen. Jeg har også lavet det således at den gemmer en cookie med det krypterede kodeord:

<?php
include("connect.php");
include("config.php");
$username = mysql_real_escape_string($_POST[username]);
$getpassword = mysql_real_escape_string($_POST[password]);
$password = md5($zzzzzzzz.$getpassword);

//IP
function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))  //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))  //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

//The login and session procedure
if ($username != "" or $getpassword != "")
{
$query = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password' LIMIT 1");

if ($row = mysql_fetch_assoc($query))
{
  session_start();
  setcookie($auth_cookie_name , $password);
  $_SESSION['loginname'] = $row['username'];
  $_SESSION['loginfirst'] = $row['firstname'];
  $_SESSION['loginlast'] = $row['lastname'];
  $_SESSION['pwd'] = $row['password'];
  $_SESSION['id'] = $row['id'];
  $_SESSION['ip'] = getRealIpAddr();
  echo "Du er nu logget ind som ";
  echo $_SESSION['loginname'];
}
else
{
  echo "Brugernavn eller kodeord er forkert.";
}
}
else
{
  echo "Nogle felter er ikke udfyldt";
}
?>
Avatar billede eds Nybegynder
20. januar 2009 - 17:11 #3
Og så har jeg lavet en session.php som skal inkluderes på alle sider:
<?php
include("config.php");
session_start();

//IP
function getRealIpAddr()
{
    if (!empty($_SERVER['HTTP_CLIENT_IP']))  //check ip from share internet
    {
      $ip=$_SERVER['HTTP_CLIENT_IP'];
    }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))  //to check ip is pass from proxy
    {
      $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
      $ip=$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

//Checks for empty session
if (empty($_SESSION['loginname']))
{
  echo '<form name="login" method="post" action="page.php">';
  echo '<p>Brugernavn: <input type="text" name="username"><br>';
  echo 'Kodeord: <input type="password" name="password"><br><input type="submit" name="login" value="Login"></p>';
  echo '</form>';
}
else
{
echo $_SESSION['loginname']."<br>";
echo $_SESSION['loginfirst']."<br>";
echo $_SESSION['loginlast']."<br>";
echo $_SESSION['id']."<br>";
echo $_SESSION['ip']."<br>";
echo $_SESSION['pwd']."<br>";
echo $_COOKIE[$auth_cookie_name];

//Authentication
  //Check password
  if ($_COOKIE[$auth_cookie_name] == $_SESSION['pwd'])
  {
  }
  else
  {
    session_destroy();
  }

  //Check ip
  if ($_SESSION['ip'] == getRealIpAddr())
  {
  }
  else
  {
    session_destroy();
  }

//Auto log-out
if (empty($_SESSION['logintime']))
{
$logintime = $_SESSION['logintime'] = time();
}

if (time() - $_SESSION['logintime'] > $auto_logout_time)
{
  session_destroy();
}
$logintime = $_SESSION['logintime'] = time();

}
?>

Denne tjekker om ip'en er den samme som der blev logget ind med. Og den tjekker om der findes en cookie med kodeord, som matcher brugerens kodeord.

Hvordan ser det ud rent sikkerhedsmæssigt?
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

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