Avatar billede larma Nybegynder
17. marts 2006 - 10:10 Der er 12 kommentarer og
1 løsning

Sikkert login script?!

Hei.

Jeg har lavet et login script i php som er ganske nemt og ovskuelig. Men er litt usikker på hvor sikkert det er, mod f.eks SQL Injections o.s.v. Er det noen som burde vært gjort anerledes? Forslag til utbedringer/forbedringer, om det er noen? Tar også imot links til andre login script, for å kigge på, og se om det er noen tips.

//script
<?php
session_start(); // start session.

if(isset($_POST['brukernavn']) && isset($_POST['passord']))
{
    include "../../secure/inc_db.php";
    $brukernavn = mysql_real_escape_string($_POST['brukernavn']);
    $passord = mysql_real_escape_string($_POST['passord']);
    $brukernavn = htmlspecialchars(addslashes($brukernavn));
    $passord = htmlspecialchars(addslashes($passord));
   
  $sql = mysql_query("SELECT brukernavn, passord FROM admin WHERE brukernavn = '$brukernavn'");
  $peker = mysql_fetch_array($sql);
    $numrows = mysql_num_rows($sql);
    if($peker[passord] == $passord && $peker[brukernavn] == $brukernavn && $numrows == "1")
    {
        $_SESSION['brukernavn']= $brukernavn;
        $_SESSION['passord']= $passord;
        header("Location:http://studenterkonto.humaniora.sdu.dk/labjo05/itcare/forside");
    }
}
?>

<body>
<?php
if(!empty($_POST['brukernavn']) && !empty($_POST['passord']))
{
    echo "<script>"."alert"."('Feil Brugernavn og/eller Passord, Prøv igjen!')"."</script>";
}
?>
<div id="innhold">
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<table border="0">
<tr>
  <td style="color:white; font-size:14px; font-weight:bold;">
        Username:
  </td>
  <td>
        <input type="text" name="brukernavn" />
  </td>
</tr>
<tr>
  <td style="color:white; font-size:14px; font-weight:bold;">
        Password:
  </td>
  <td>
        <input type="password" name="passord" />
  </td>
</tr>
<tr>
  <td colspan="2" align="right">
        <input type="submit" name="login" value="Login" />
</form>
  </td>
</tr>
</table>
</body>
</html>

Mvh
LarMa
Avatar billede jakobdo Ekspert
17. marts 2006 - 12:47 #1
Det ser nu meget fornuftigt ud.
Men ret evt:
$sql = mysql_query("SELECT brukernavn, passord FROM admin WHERE brukernavn = '$brukernavn'");
til:
$sql = mysql_query("SELECT brukernavn, passord FROM admin WHERE brukernavn = '$brukernavn' AND passord = '$passord' LIMIT 1");

og så bare tjek om:
if(mysql_num_rows($sql) == 1)
//VI HAR EN BRUKER
else
//VI HAR IKKE EN BRUKER
Avatar billede larma Nybegynder
17. marts 2006 - 14:34 #2
Hei igjen jakobdo ;)

Det har lige dukket opp et lille "problem". Jeg har lavet en logut funksjon, hvor jeg redirecter til "login siden" og sletter sessionene($_SESSION['brukernavn'] og $_SESSION['passord']). Men jeg kan likevel komme inn igjen på den passord beskyttete siden ved å tykke på tilbake knappen i browseren. Er det noen mulighet for å forhindre dette? Det virker måske som om ikke sessionene blir slettet. For jeg har et skript på de passod beskyttete sidene som kontrollerer om $_SESSION['brukernavn'] og $_SESSION['passord'] er satt eller ikke. Legger ved koden.

Logut link:
<a href="<?php $logut = 'logut';  ?>">Logg ut</a>

Logut funksjon i toppen av hver side:
if(isset($_POST['logut']))
{
    $_SESSION = array();
      session_destroy();
    header("Location:login.php");
    exit();
}
?>

funksjon på alle sidene som kontrollerer om en er logget inn (er en function uten parametere):
function sjekk()
{
    if(!isset($_SESSION['brukernavn']) && !isset($_SESSION['passord']))
    {
        header("Location:login.php);
        exit();
    }
}
Mvh LarMa
Avatar billede jakobdo Ekspert
17. marts 2006 - 14:43 #3
I din logout funktion, husker du session_start() ?
Avatar billede larma Nybegynder
17. marts 2006 - 16:46 #4
Ja, jeg har session_start(); i toppen av hver side. function sjekk() er en ekstern fil som jeg kaller i toppen av hver side (sier det i tilfelle det kan forårsake/skape noe forkert).

Koden i toppen på sidene:
<?php
  session_start();
  include "inc_sjekk.php";
  sjekk();

if(isset($_POST['logut']))
{
  $_SESSION = array();
  session_destroy();
  header("Location:login.php");
  exit();
}
?>
Avatar billede jakobdo Ekspert
17. marts 2006 - 18:27 #5
Din logout function ser ellers ok ud!
Prøv evt du har logget ud og tjek koden:
echo "<pre>";
print_r($_SESSION);
echo "</pre>";

og se hvad session indeholder.
Avatar billede larma Nybegynder
17. marts 2006 - 20:58 #6
Sessionene ble ikke slettet, så det virker som om man blir redirectet før sessionene blir slettet. Men jeg har funnet en løsning på det.

//Når man logger inn med riktig brukernavn og passord oppretter jeg en ny session sammen med de gamle:
    $_SESSION['brukernavn']= $brukernavn;
    $_SESSION['passord']= $passord;
    $_SESSION['login']= "true"; //Denne er da ny

//Og når man trykker på linken LOGUT settes $_SESSION['login']== "false".:
<a href="<?php $logut = 'logut'; $_SESSION['login']= 'false'; ?>">Logg ut</a>

Når $logut har en verdi blir man redirectet tilbake til login siden ved hjelp av denne koden:
if(isset($_POST['logut']))
{
    header("Location:login.php");
    exit();
}

Og i toppen av login siden har jeg nå satt inn den nye koden som sletter sessionene:
if($_SESSION['login']== "false")
{
  $_SESSION = array();
  session_destroy();
}
Denne koden går da igjennom når man har trykket på logut linken. For da settes jo $_SESSION['login'] = "false". Og alle sessionene blir også slettet.

Det er vel en grei måte å gjøre det på det her?
Avatar billede jakobdo Ekspert
17. marts 2006 - 21:21 #7
Det er ok måde at gøre det på ja.
Men det ville jo være bedre at få det andet til at virke.
Hvad om du smider din logout funktion i en ekstern fil?
Avatar billede larma Nybegynder
18. marts 2006 - 02:59 #8
Det gikk heller ikke noe godt. Jeg fikk det til å virke, men det ble mer kode og den ble mindre overskuelig, så jeg gikk tilbake til metoden jeg forklarte over. Jeg har gjort noen små forandringer.

Logut linken setter nå bare $_SESSION['login']= 'false':
<a href="<?php $_SESSION['login']= 'false'; ?>">Logg ut</a>

Så sjekker jeg på om login session er satt til false, om den er det sendes man til login.php:
if($_SESSION['login'] == "false")
{
  header("Location:login.php");
  exit();
}

Ellers er resten av koden som forklart over. Det virker fint i microsoft explorer og mozilla, men i opera kan jeg trykke på tilbake knappen og komme tilbake til den passord beskyttete siden. Vet du hva som kan være forkert, eller hvordan jeg kan lave det for å ungå dette?
Avatar billede pidgeot Nybegynder
18. marts 2006 - 03:06 #9
Er du sikker på det ikke blot er fordi Opera ikke genindlæser siden, men tager det fra sin cache? Prøv om du stadig kan se siden hvis du trykker Opdater.
Avatar billede larma Nybegynder
18. marts 2006 - 03:19 #10
Det hadde du rett i ;) Ble redirectet når jeg trykket på opdater. Det tenkte jeg ikke på. Ellers skal vel det her være en ok login/logut funksjon det her nå? Ingen som ser noen spesielle svakheter som bør utbedres?
Avatar billede larma Nybegynder
18. marts 2006 - 17:34 #11
Gir du et svar jakobdo. Så jeg får gitt deg poengene for hjelpen.
Avatar billede jakobdo Ekspert
18. marts 2006 - 19:02 #12
Et svar!
Avatar billede jakobdo Ekspert
18. marts 2006 - 21:38 #13
Takker for point!
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