Loginsystem og sikkerhed

Tags:    php

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.



10 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
Ah ja, det med tomme felter havde jeg ikke tænkt over, kan det ikke omgås med noget i retninget af;
Fold kodeboks ind/udKode 
?

Og jeg er ikke sikker på hvad du mener med "escape sql tegn" ?


Prøv

$query = mysql_query("SELECT * FROM users WHERE username='mysql_real_escape_string($username)' AND password='mysql_real_escape_string($password)'");


Den skulle gerne lave ' tegnene om til noget andet mm. :)

Der kan være lidt issues med strengen, kender ikke til php så ved ikke lige hvordan man streng concatinerer

/J

/J



Indlæg senest redigeret d. 20.01.2009 16:49 af Bruger #5789
Jeg ville gøre noget lignende dette:

<?php
include("connect.php");
include("config.php");

$username = $_POST[username];
$getpassword = $_POST[password];
$password = md5($zzzzzzzz.$getpassword);

$str_sql = "SELECT * FROM users
WHERE username='".addslashes($username)."'
AND password='".addslashes($password)."'
LIMIT 1";

$query = mysql_query($str_sql);
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.";
}
?>



Hvad hvis man skriver noget ala:

' or 's'='s

i password og levner username tom, vil dit sql ikke blive noget ala:


SELECT * FROM users WHERE username='' AND password='' or 's'='s'");

Altså vil man blive logget ind som den første bruger, kender man username på en bruger, kan man bare skrive det som bruger navn.

Jeg ved ikke lige om ovenstående virker praktisk, men hullet er der.

Så tag at escape sql tegn mm (tænker der er en metode til det)

/J




Mht til at opsnappe session id, tror jeg oftes det er når en bruger har et sikkerhedshul, der lader hacker hente cookie med sessionid fysisk fra pc.

Så jo en ip restriction ville hjælpe, men mon ikke de fleste der arbejder med sådan noget kan fake en ip.

/J



Ah ja, det med tomme felter havde jeg ikke tænkt over, kan det ikke omgås med noget i retninget af;
Fold kodeboks ind/udKode 
?

Og jeg er ikke sikker på hvad du mener med "escape sql tegn" ?



Ah ja, det med tomme felter havde jeg ikke tænkt over, kan det ikke omgås med noget i retninget af;
Fold kodeboks ind/udKode 
?

Og jeg er ikke sikker på hvad du mener med "escape sql tegn" ?



Ah okay, jeg kan se hvis man bruger mysql_real_escape_string så fjerner den "farlige" tegn. Jeg har desuden lavet det således at den lagrer ip + at den gemmer brugerens krypterede kode ord i en cookie. Så hvis ikke der på den computer, der forsøger at tilgå sessionen ligger en cookie med kodeordet, så dræbbes sessionen.

Fold kodeboks ind/udKode 


Jeg ved ikke om det er tilstrækkeligt?



Jeg tror netop det er denne cookie de stjæler.

Så et hashtjek af nogle locale UA settings var nok mere passende. Sammenlign dem så med clienten, og hvis det ikke er samme settings... Kill it.

/J



lige en ting, jeg ville nok flytte session_start(); op før doc-typen..



Indlæg senest redigeret d. 21.01.2009 02:57 af Bruger #3427
medmindre du tillader at username eller password er tomme bør du nok kræve at begge 2 ikke er tomme altså et and ikke or.

Derudover synes jeg helt generelt at man altid bør sikrer sig at input er på en korrekt form før man spilder resourcer på at bruge inputtet, derfor bør det første du gør i dette tilfælde være at teste denne om felterne er tomme:
Fold kodeboks ind/udKode 

Iøvrigt bør du vende dig til at skrive ['key'] eller ["key"] og ikke [key].



t