Avatar billede nicocarlos Nybegynder
21. august 2004 - 01:07 Der er 49 kommentarer og
1 løsning

Jeg bliver logget ud når jeg bruger sessions.

Hej. Jeg har lavet et login system hvor man modtager følgende når man logger ind:

session_start();

session_unset();
               
session_destroy();
   
@ session_register("pass");
$HTTP_SESSION_VARS["pass"] = $password1;
               
@ session_register("id");
$HTTP_SESSION_VARS["id"] = $username1;

samtidig har jeg lavet en tjekker på mine sider som jeg includer på alle mine sider. Som ser sådan her ud

<?PHP
$rememberCookieUname = @$HTTP_COOKIE_VARS["rememberCookieUname"];
$rememberCookiePassword = @$HTTP_COOKIE_VARS["rememberCookiePassword"];

include("config.php");

session_start();

$query = "Select * from v_users where username='".@$HTTP_SESSION_VARS[id]."' And password = '".@$HTTP_SESSION_VARS[pass]."'";
$result = mysql_query($query);

if ($row = mysql_fetch_array($result)){
}else{
   
    if ($rememberCookiePassword != "" && $rememberCookieUname != ""){
       
        $query = "Select * from v_users where username='".$rememberCookieUname."'";
        $result = mysql_query($query);
        if ($row = mysql_fetch_array($result)){
           
            if (md5($row["password"]) == $rememberCookiePassword){
               
    session_unset();
                   
    session_destroy();
               
                    @ session_register("pass");
                    $HTTP_SESSION_VARS["pass"] = $rememberCookiePassword;
                    @ session_register("id");
                    $HTTP_SESSION_VARS["id"] =  $rememberCookieUname;
            }else{die("Please log-in.");}
        }else{die("Please log-in.");}       
    }else{die("Please log-in.");}
}

$user_currently_loged = htmlspecialchars($HTTP_SESSION_VARS["id"],ENT_NOQUOTES);

$user_currently_loged = str_replace ('\"', "&quot;", $user_currently_loged);
$user_currently_loged = str_replace ("\'", "&#039", $user_currently_loged);

$user_currently_loged_plain = @$HTTP_SESSION_VARS["id"];
?>

Problemet kommer i at brugeren bliver logget ud når han opdatere ting eller prøver at lave noget det går gennem en form. Man kan sagtens trykke rundt på alle links osv uden problemer, men hvis man f.eks. vil angribe en anden, skriver man id og trykker attack, så får man resultatet, men hvis man så vil trykke på main eller andre links bliver man logget ud.

Håber virkelig at der er en som forstår og kan hjælpe :)
Avatar billede nicocarlos Nybegynder
21. august 2004 - 01:09 #1
Rettelse:
hvis man f.eks. vil angribe en anden (et spil jeg har lavet), skriver man id og trykker attack, så får man resultatet rigtigt nok, men hvis man så bagefter vil trykke på main eller andre links bliver man logget ud.
Avatar billede dennismp Nybegynder
21. august 2004 - 01:10 #2
Er der nogen grund til at du ikke bruger $_SESSION ?
Avatar billede nicocarlos Nybegynder
21. august 2004 - 01:11 #3
Nej det er der ikke, men jeg tog en tutorial og læste om sessions or lærte det på den måde, hvordan kan jeg rette det, så det kommer til at virke med $_SESSION?
Avatar billede nicocarlos Nybegynder
21. august 2004 - 01:16 #4
eller kunne du give mig et par link til hvordan det kunne laves med $_SESSION eller? Alt ville hjælpe :)
Avatar billede dennismp Nybegynder
21. august 2004 - 01:21 #5
Det er ret nemt:
session_start();
session_destroy();

kender du.. og de virker som du forventer.

session_register skal du glemme..

Når du skal gemme noget i en session: $_SESSION['etnavn'] = 'enværdi';
Når du skal bruge det igen: $_SESSION['etnavn'];
Skal du fjerne et element: unset($_SESSION['etnavn']);

som du kan se, er det "bare" et array du arbejder med - borset fra at det gemmes i en session. Ligesom $HTTP_SESSION_VARS.

Du kan lave en lilel testfil, så du føler dig fortroligt med det:
<?php
session_start();
if( isset($_SESSION['count']) )
  $num = $_SESSION['count'];
else
  $num = 1;

print "Du har set denne side $num gange i denne session";

$_SESSION['count'] = $num+1;
?>
Avatar billede dennismp Nybegynder
21. august 2004 - 01:22 #6
og hvis man bliver i tvivl om hvad der er gemt i session'n, så kan man altid bare lave en print_r($_SESSION);

det kan være du allerede ved dette, men det er nu meget rart :)
Avatar billede nicocarlos Nybegynder
21. august 2004 - 01:26 #7
og jeg prøver lige at ændre mit til, så venter lige med at give dig point hvis det nu går helt galt.. :)
Avatar billede dennismp Nybegynder
21. august 2004 - 01:30 #8
Det er også kun fair - jeg har alligevel ikke travlt.
Avatar billede nicocarlos Nybegynder
21. august 2004 - 01:31 #9
Det vil sige min login kommer til at se sådan her ud:
session_start();
               
session_destroy();
               
$_SESSION['pass'] = $password1;
               
$_SESSION["id"] = $username1;

? :)
Avatar billede dennismp Nybegynder
21. august 2004 - 01:37 #10
Jeps,

Men har du behov for session_destroy() ? Hvis folk logger ind, så er det vel fordi de ikke er kendt af dit system? Den virker lidt overflødigt.. Jeg bruger den kun, når folk trykker "logout" på min side.
Avatar billede nicocarlos Nybegynder
21. august 2004 - 01:39 #11
Og dette bliver så mit tjekke bruger script:

<?PHP
$rememberCookieUname = @$HTTP_COOKIE_VARS["rememberCookieUname"];
$rememberCookiePassword = @$HTTP_COOKIE_VARS["rememberCookiePassword"];

include("config.php");

session_start();

$query = "Select * from v_users where username='".$_SESSION['id']."' And password = '".$_SESSION['pass']."'";
$result = mysql_query($query);

if ($row = mysql_fetch_array($result)){
}else{
    if ($rememberCookiePassword != "" && $rememberCookieUname != ""){
        $query = "Select * from v_users where username='".$rememberCookieUname."'";
        $result = mysql_query($query);
       
        if ($row = mysql_fetch_array($result)){

            if (md5($row["password"]) == $rememberCookiePassword){

                    session_destroy();
                   
                    $_SESSION['pass'] = $rememberCookiePassword;
                       
                    $_SESSION['id'] =  $rememberCookieUname;
            }else{die("Please log-in.");}
        }else{die("Please log-in.");}       
    }else{die("Please log-in.");}
}

$user_currently_loged = htmlspecialchars($_SESSION['id'],ENT_NOQUOTES);

$user_currently_loged = str_replace ('\"', "&quot;", $user_currently_loged);
$user_currently_loged = str_replace ("\'", "&#039", $user_currently_loged);

$user_currently_loged_plain = $_SESSION["id"];
?>

eller?
Avatar billede nicocarlos Nybegynder
21. august 2004 - 01:43 #12
har fjernet  session_destroy(); i begge script nu
Avatar billede dennismp Nybegynder
21. august 2004 - 01:43 #13
Det ser rigtigt ud .. virker det?

(der findes også en $_COOKIE som svarer til $HTTP_COOKIE_VARS)
Avatar billede nicocarlos Nybegynder
21. august 2004 - 01:46 #14
det virker ikke jeg ryger stadig ind i:
  }else{die("Please log-in.");}
        }else{die("Please log-in.");}       
    }else{die("Please log-in.");}

hvilket vil sige at jeg bliver logget ud eller?
Avatar billede dennismp Nybegynder
21. august 2004 - 01:48 #15
Kna du ikke skrive et tal ved de 3 tekster, så du kan se hvilken een af dem, du får vist? Så er det måske nemmere at komme på sporet af problemet.
Avatar billede nicocarlos Nybegynder
21. august 2004 - 01:48 #16
jup det fixer jeg lige 2 sek
Avatar billede nicocarlos Nybegynder
21. august 2004 - 01:49 #17
det er den sidste jeg ryger ud på...
Avatar billede dennismp Nybegynder
21. august 2004 - 01:53 #18
Prøv at skrive $query ud, så vi kan se sql-sætningen (den må jo fejle, samt at du ikke har sat cookies, for at den kan komme dertil)..

prøv evt også at tilføje en print_r($_SESSION);
Avatar billede nicocarlos Nybegynder
21. august 2004 - 01:59 #19
Select * from v_users where username='1' And password = 'df53ca268240ca76670c8566ee54568a'

Det er der ikke noget der hedder, username skulle være et navn ikke id som jeg får her men kan ikke se hvor det kommer fra
Avatar billede dennismp Nybegynder
21. august 2004 - 02:03 #20
ved login hvor du sætter id + pass, prøv at skrive dem ud ligeefter (evt med den print_r) .. Hvad siger den der?

$_SESSION['pass'] = $password1;
$_SESSION["id"] = $username1;
Avatar billede nicocarlos Nybegynder
21. august 2004 - 02:03 #21
jeg henter på intet tidspunkt ID af brugeren og hvis jeg ændrer til where ID, jeg så skriver den det rigtige username, det er dybt underligt...
Avatar billede nicocarlos Nybegynder
21. august 2004 - 02:04 #22
Array ( [pass] => df53ca268240ca76670c8566ee54568a [id] => nicocarlos )


og det er rigtigt
Avatar billede nicocarlos Nybegynder
21. august 2004 - 02:07 #23
$query = "Select * from v_users where username='".$_SESSION['id']."' And password = '".$_SESSION['pass']."'";
$result = mysql_query($query);

kan det være fordi der står punktum foran det med session???
Avatar billede dennismp Nybegynder
21. august 2004 - 02:12 #24
Et par forslag:

1) Prøv øverst i dit brugertjek-script at skrive $_SESSION ud igen (lige efter session_start(). Er den ok? Hvis den er, så er fejlen i det script. Hvis ikke, så må det være et andet sted (der hvor de måske sættes).

2) Prøv at søge i dine filer efter $_SESSION, $HTTP_SESSION_VARS og list dem der bruger id her.. Der må være een af dem, der "kommer til" at ændre det. Bare tag hele skidtet.
Avatar billede dennismp Nybegynder
21. august 2004 - 02:13 #25
Nej.. Punktummet ændre ikke på indholdet af session-variablet.. Den "sætter" bare dine stringe sammen. (som så bliver tildelt til $query).
Avatar billede nicocarlos Nybegynder
21. august 2004 - 02:23 #26
jeg fatter det simpelthen ikke...har kigget alt gennem 10 gange nu og henter ikke ID nogle steder
Avatar billede dennismp Nybegynder
21. august 2004 - 02:29 #27
Har du prøvet mit første forslag? Så vi ved om det er det script der tjekker brugernavn/kodeord eller om det er andetsteds?

Hvor meget kode er der? Så kan jeg evt se på det med friske(?) øjne.
Avatar billede nicocarlos Nybegynder
21. august 2004 - 02:33 #28
der er ikke ret meget. Vi snakker om login.php og membersonly.php, skal jeg uploade dem til dig så du kan se det hele?? eller hvad tænker du på.

Og til dit forslag 1, ja den er okaj efter Session Start ()
Avatar billede dennismp Nybegynder
21. august 2004 - 02:37 #29
Hvis den er ok der, så er det ikke nødvendigt..

dvs hvis du sætter print ind før/efter denne linje:
$query = "Select * from v_users where username='".$_SESSION['id']."' And password = '".$_SESSION['pass']."'";

så får du een med rigtig $_SESSION['id'] og en forkert ?
Avatar billede nicocarlos Nybegynder
21. august 2004 - 02:41 #30
nej de er begge rigtige
Avatar billede nicocarlos Nybegynder
21. august 2004 - 02:43 #31
men problemet kommer når jeg f.eks angriber en bruger gennem en form eller andet....
så ændrer det sig.
til ID istedet for Username...
Avatar billede nicocarlos Nybegynder
21. august 2004 - 02:46 #32
Fejlen ligger ikke i login.php
Avatar billede nicocarlos Nybegynder
21. august 2004 - 02:47 #33
Så den må ligge i følgene, som jeg includer på alle mine sider når man er logget ind:

<?PHP
$rememberCookieUname = @$HTTP_COOKIE_VARS["rememberCookieUname"];
$rememberCookiePassword = @$HTTP_COOKIE_VARS["rememberCookiePassword"];

include("config.php");

session_start();

$query = "Select * from v_users where username='".$_SESSION['id']."' And password = '".$_SESSION['pass']."'";
$result = mysql_query($query);

if ($row = mysql_fetch_array($result)){
}else{
    if ($rememberCookiePassword != "" && $rememberCookieUname != ""){
        $query = "Select * from v_users where username='".$rememberCookieUname."'";
        $result = mysql_query($query);
       
        if ($row = mysql_fetch_array($result)){

            if (md5($row["password"]) == $rememberCookiePassword){

                    session_destroy();
                   
                    $_SESSION['pass'] = $rememberCookiePassword;
                       
                    $_SESSION['id'] =  $rememberCookieUname;
            }else{die("Please log-in.");}
        }else{die("Please log-in.");}       
    }else{die("Please log-in.");}
}

$user_currently_loged = htmlspecialchars($_SESSION['id'],ENT_NOQUOTES);

$user_currently_loged = str_replace ('\"', "&quot;", $user_currently_loged);
$user_currently_loged = str_replace ("\'", "&#039", $user_currently_loged);

$user_currently_loged_plain = $_SESSION["id"];
?>
Avatar billede nicocarlos Nybegynder
21. august 2004 - 02:48 #34
Og jeg ryger hele tiden in i please login nummer 3...
Lad os kigge på det imorgen jeg er for træt nu :/
Avatar billede nicocarlos Nybegynder
21. august 2004 - 02:49 #35
men hvis det er kan du så ikke ændre det helt så det kommer til at virke...? Eller fortælle mig hvordan du ville lave login.php og membersonly.php, fordi vi kommer ikke rigtig nogen vejne :(
Avatar billede dennismp Nybegynder
21. august 2004 - 03:03 #36
Det med at vente til "imorgen" er nok en god idé. Kan jeg få en kopi af den anden fil, så vil jeg se på det imorgen.
Avatar billede nicocarlos Nybegynder
21. august 2004 - 11:31 #37
http://www.alt-muligt.dk/login.phps

det eneste som ikke passer er include connect.php
det harjeg ændret til config.php :)
Avatar billede dennismp Nybegynder
21. august 2004 - 12:15 #38
jeg får denne sql:

Select * from v_users where username='dennis' And password = '7daacea5f373b4c1c054158b126d317f'

Er du sikker på at du ikke har en gammel session med en ugyldig værdi?
For det virker fint her :)
Avatar billede nicocarlos Nybegynder
21. august 2004 - 12:31 #39
ja hvor skulle den komme fra? :), jeg bruger slet ikke sessions i mine andre script, kan det være fordi jeg includer brugertjek på alle sider??
Avatar billede nicocarlos Nybegynder
21. august 2004 - 12:33 #40
fejlen sker efter jeg har været inde i attackplayer.php men der er ikke nogle sessions i den..kun dem jeg includer i tjekbruger
Avatar billede nicocarlos Nybegynder
21. august 2004 - 12:40 #41
jeg tror jeg bliver nødt til at lave et helt nyt login system :(
Avatar billede dennismp Nybegynder
21. august 2004 - 12:43 #42
Prøv engang selv på min installation:

http://dennis.moellegaard.dk/v4/php/531463/

Så burde det jo virke. Hvis du vil se sourcen så kan du trykker på &#960;. brugernavn/kodeord er "dennis". Jeg har skrevet DMP ved alle de linjer jeg har rettet i.
Avatar billede dennismp Nybegynder
21. august 2004 - 12:50 #43
Det er jo self. op til dig selv, men det burde altså virke (og gør det tilsyneladende også her).

&#960 = pi-tegnet
Avatar billede nicocarlos Nybegynder
21. august 2004 - 12:51 #44
ja jeg kan også godt logge ind helt rigtigt med mit script, men der må ligge en fejl et sted så jeg tror jeg bliver nødt til at lave alt forfra...fordi problemet kommer når jeg trykke links osv. eller kommer gennem en form
Avatar billede dennismp Nybegynder
21. august 2004 - 13:05 #45
Kan jeg se attackplayer.php eller en af de andre filer, så jeg kan se problemet? (og arbejde med det)

Hvis du altså ikke helt har opgivet kode :)
Avatar billede nicocarlos Nybegynder
21. august 2004 - 13:11 #46
JEG FANDT FEJLEN, lig et svar for den super hjælp du har givet mig :)
Avatar billede nicocarlos Nybegynder
21. august 2004 - 13:13 #47
Jeg har lavet følgende i attackplayer.php:

$id=brugerid

så når jeg lavede det script, så blev min session[id] lavet om til brugerid istedet fr username og mna blev derfor logget ud, viste ikke det hang sådan sammen :)
Avatar billede nicocarlos Nybegynder
21. august 2004 - 13:24 #48
Lige en ting til, ved du hvordan eller hvor man kan læse noget om sessions og hvor lang tid de skal holde før man bliver logget ud osv?
Avatar billede dennismp Nybegynder
21. august 2004 - 14:06 #49
Herligt :)

Der afgøres af session.gc_maxlifetime

Du kan evt bruge phpinfo() og så søge efter gc_maxlifetime eller brug ini_get('session.gc_maxlifetime') .. eller kik i din php.ini :)

Default er 1440 sekunder. (24mins)
Avatar billede nicocarlos Nybegynder
21. august 2004 - 18:43 #50
okaj, tak for hjælpen.. :)
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