Avatar billede supermand69 Nybegynder
29. juli 2004 - 19:45 Der er 14 kommentarer og
3 løsninger

sikkerhed i logon script

Kan man lave en højere sikkerhed på dette script, så uvedkommende ikke kan snyde sig ind??

if($_POST['logon_email'] && $_POST['logon_pass'])
{
    $get = mysql_query("SELECT id, active, name, pass FROM $DB.user WHERE email='$_POST[logon_email]' && pass='$_POST[logon_pass]'");
    if($row = mysql_fetch_array($get))
    {
        if($row['active'])
        {
            $_SESSION['userid'] = $row['id'];
           
            mysql_query("UPDATE $DB.user SET last_log=$TIME WHERE id=$row[id]");
           
            php_end($_SERVER["PHP_SELF"]);
        }
    }
}
Avatar billede Slettet bruger
29. juli 2004 - 21:19 #1
Du kunne måske md5 kryptere det password du tjekker om eksisterer ved logon.

Ydermere ved jeg ikke om der er flere sites forbundet i dit loginsystem, hvis der er, så lav en $logged_in == "true", og lav en session der tjekker om denne er sat i toppen af hver side.

--
pacroon
Avatar billede supermand69 Nybegynder
29. juli 2004 - 21:52 #2
gider du give et eksempel med md5? :)

hvad mener du helt præcist med den $logged_in??
Avatar billede swaxi Nybegynder
30. juli 2004 - 15:29 #3
du skal passe på med bare at smide variable fra $_POST ind i en sql-query. du kan bruge mysql_escape_string() til formålet. eg :

$query = "SELECT id, active, name, pass FROM $DB.user WHERE email='" . mysql_escape_string($_POST[logon_email]) . "' && pass='" . mysql_escape_string($_POST[logon_pass]). "'"
$get = mysql_query($query);


desuden ville det nok være klogt at checke ved hvert mysql_* om det lykkedes. eg. noget a la
mysql_query($query) or die(mysql_error());

i øvrigt bør du sikre dig at register_globals ikke er sat til på din server, da brugeren ellers muligvis (kommer an på resten af din kode) kan override $DB. det kan du evt. klare ved også at bruge mysql_escape_string() omkring $DB.
Avatar billede supermand69 Nybegynder
01. august 2004 - 21:51 #4
hvad kan der ske ved at bruge $_POST direkte i min query?

globals er ikke sat til ;)

hvordan kunne man bruge md5?? er det kryptering??
Avatar billede squashguy Nybegynder
01. august 2004 - 22:23 #5
prøv at forestil dig sql-sætningen hvis jeg indtaster følgende som min email:

supermand69@site.dk'#

bliver til:

SELECT id, active, name, pass FROM $DB.user WHERE email='supermand69@site.dk'#

alt efter # vil blive ignoreret, og jeg kan logge ind som en anden bruger, uden at kende dennes password.

magic quotes, som er enabled på mange servere, gør dog at man ikke er såbar.

men uden magic quotes, er det ret vigtigt med mysql_escape_string()
Avatar billede swaxi Nybegynder
01. august 2004 - 22:25 #6
du risikerer at blive udsat for sql-injection.

md5 er en såkaldt envejs kryptering. som regel bruger man det til, at kryptere passwords i databasen så de ikke kan læses, hvis en hacker får adgang til din db. (men det burde han alligevel ikke få i første omgang)
da det er en envejs kryptering (i modsætning til en symmetrisk kryptering), har det ydderligere den fordel at sysadm (dig) ikke har mulighed for at finde ud af hvad folks passwords er. det er en øget sikkerhed for brugeren, eftersom man ofte bruger samme password flere steder, og du ville derfor kunne misbruge oplysningen.

du kan bruge md5 ved at anvende mysql-funktionen MD5()
eks :
$get = mysql_query("SELECT id, active, name, pass FROM $DB.user WHERE email='$_POST[logon_email]' && pass=MD5('$_POST[logon_pass]')");

du skal så bare huske at gøre det der, hvor du indsætter i db også.
Avatar billede supermand69 Nybegynder
01. august 2004 - 22:29 #7
magic quotes er enabled :)

pass i min db er ikke krypteret... kan man ikke bare nøjes med at lave en md5 på både input og det fra sql??
Avatar billede supermand69 Nybegynder
01. august 2004 - 22:36 #8
jeg vil ikke lave md5 på alle passwords i min db, da jeg skal have mulighed for at sende pass i en e-mail hvis det bliver glemt
Avatar billede swaxi Nybegynder
01. august 2004 - 22:47 #9
en anden måde at bruge md5 på er, at encrypte password'et med md5 vha. en javascript-funktion, inden du submit'er din form. en lettere (og endnu sikrere) løsning ville dog være bare at køre dit site over ssl-forbindelse. eller i det mindste selve login-formen.

det er i øvrigt også en god idé, at regenerere session_id, når brugeren logger ind. det sikrer imod den mest alm. form for session-hijacking. du kan gøre det ved, at smide følgende funktionskald ind :
session_regenerate_id();
Avatar billede squashguy Nybegynder
01. august 2004 - 22:50 #10
swaxi, den der session_regenerate_id(), prøv lige at fortæl Admin her på Eksperten, at den er god at benytte :)
Avatar billede supermand69 Nybegynder
01. august 2004 - 22:58 #11
hvad mener du med session_regenerate_id()

hvad gør den?
Avatar billede swaxi Nybegynder
02. august 2004 - 00:21 #12
funktionen gør, at din session får et nyt nummer. dvs. selvom der måtte være en person, der har hijack'et din session, så vil hans forsøg mislykkedes idét din aktuelle (usikre) session bliver lukket og en ny bliver åbnet.
det klares ved, at kalde ovennævnte funktion, og du bør derfor gøre det når en bruger logger ind i dit system. bare smid funktionskaldet ind lige før denne linie :
$_SESSION['userid'] = $row['id'];
Avatar billede swaxi Nybegynder
02. august 2004 - 00:27 #13
> squashguy
der var en glimrende artikel om emnet i php|architect i februar 2004 nummeret. ( http://www.phparch.com/issue.php?mid=24 ) du kan jo prøve at sende den i nakken på admin.
Avatar billede supermand69 Nybegynder
02. august 2004 - 16:29 #14
altså sådan??

session_regenerate_id();
$_SESSION['userid'] = $row['id'];
Avatar billede swaxi Nybegynder
03. august 2004 - 02:22 #15
jeps
Avatar billede supermand69 Nybegynder
03. august 2004 - 15:23 #16
det virker ikke?!
Avatar billede supermand69 Nybegynder
10. august 2004 - 17:22 #17
jeg kan ikke få den til at virke?!
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