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:
$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?
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.
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:
//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"; } ?>
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; }
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?
Synes godt om
Ny brugerNybegynder
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.