Avatar billede bmdk Nybegynder
16. maj 2008 - 14:01 Der er 46 kommentarer og
1 løsning

Jeg giver op (session spørgsmål inside)

Hey eksperter,

Som nogen af jer sikkert ved ;) så er jeg ved at lave et site hvor der kan være flere brugere.

Jeg er nu løbet ind i det problem, at når du har været logget ind på en bruger og derefter logger ind på en anden bruger, så skifter den pludselig over på den foregående bruger.

Problemet er lidt omstændigt, så jeg foretrækker at tage den over MSN, hvis der er en derude, der har tålmodighed til at hjælpe mig med det her.
Avatar billede kimg Nybegynder
16. maj 2008 - 14:05 #1
Det lyder som om at du glemmer at slette dine sessions når du logger af den anden bruger? men selvfølgelig et gæt, ud fra dine oplysninger.

Kim
Avatar billede bmdk Nybegynder
16. maj 2008 - 14:11 #2
Hmm ja, det er også min tanke, men jeg har snart prøvet samtlige metoder til at slette de sessions.

En anden ting er, at f.eks. den session jeg har sat med $brugernavn ikke gør det.

I kan lige prøve at se min login.php, hvor jeg sætter sessions.
session_start();
    $form_user = $_POST['brugernavn'];
    $form_pass = $_POST['kodeord'];

    $resultat = mysql_query("SELECT bId FROM brugere WHERE brugernavn = '$form_user' AND password = '$form_pass'");//Spørger efter ID
    $number = mysql_num_rows($resultat);//Tæller antaller af resultater

    if($number == 1) {
    $status_array = mysql_query("SELECT status, navn FROM brugere WHERE brugernavn = '$form_user' AND password = '$form_pass'");
        $status = mysql_fetch_array($status_array);
        $_SESSION['adgang'] = "true";
        $_SESSION['status'] = $status[0];
    $_SESSION['brugernavn'] = $brugernavn;
    $_SESSION['navn'] = $navn;
    header("location: enurl");
   
    } else if ($number != 1) {
        header("location: index.php");
    }
Avatar billede bmdk Nybegynder
16. maj 2008 - 14:12 #3
Navnet kommer også først frem når man har klikket lidt rundt på siden og så skifter det bare pludselig til den foregående login session. Det er vildt mærkeligt :(
Avatar billede bmdk Nybegynder
16. maj 2008 - 15:17 #4
Jeg fandt selv ud af det hehe ;) det hjalp lige at få en pause væk fra det en halv times tid.

Lavede bare en sql query mere, der stod for, at hente * fra brugere. Hvorfor det ikke virkede med $status_array queryen har jeg ingen anelse om, men det virker nu.

Min login.php ser nu sådan her ud:

<?
session_start();
    $form_user = $_POST['brugernavn'];
    $form_pass = $_POST['kodeord'];

  $query = mysql_query("SELECT bId FROM brugere WHERE brugernavn = '$form_user' AND password = '$form_pass'");
  $result = mysql_num_rows($query);
  if($result == 1) {
    $status_array = mysql_query("SELECT status, navn FROM brugere WHERE brugernavn = '$form_user' AND password = '$form_pass'");
    $status = mysql_fetch_array($status_array);
    $_SESSION['adgang'] = "true";
    $_SESSION['status'] = $status[0];
    $_SESSION['brugernavn'] = $arrayresult["brugernavn"];
   
    $data = mysql_query("SELECT * FROM brugere WHERE brugernavn = '$form_user' AND password = '$form_pass'");
    $hentdata = mysql_fetch_array($data);
    $_SESSION['navn'] = $hentdata["navn"];
    $_SESSION['brugerensid'] = $hentdata["bId"];

    header("location: enurl");
  } else if ($result != 1) {
      header("location: index.php");
  }
   
?>
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 08:05 #5
Ved godt du selv har løst det, men syntes lige du skal tage følgende til eftertanke.

I dit førrste script du postede, har du ingen steder hvor du sætter $brugernavn...

brugernavnet som brugeren taster ind kalder du $form_user .. og i databasen henter du kun bId, status og navn...

Det kunne måske være en god ide at på din første $query at skrive navn, status efter bId og så spare de 2 andre mysql kald væk...

har kigget lidt på dit script, og tilføjet lidt sikkerhed i det også. ;)

htmlspecialchars burde du læse lidt op på, og bruge hver gang en bruger kan tilføje noget. Det jeg er ude i her, er det der kaldes sql injection.. dvs. ufrivillig adgang via input felter, textarea's osv.
Du kan google det og læse lidt mere om det. ;)

altså:

<?php

// Husk dine mysql oplysninger.

    session_start();
/*
Trim fjerner mellemrum først og sidst i strengen.
htmlspecialchars konventerer specielle tegn, for at forhindre mysql injection.
*/
    $form_user = trim(htmlspecialchars($_POST['brugernavn']));
    $form_pass = trim(htmlspecialchars($_POST['kodeord']));

    if(empty($form_user) || empty($form_pass)) { // tjekker at ingen af felterne er tomme.
    header("Location: index.php"); // sender brugeren tilbage hvis et tomt felt er fundet.
    exit;
    }

    $resultat = mysql_query("SELECT bId, status, navn FROM brugere WHERE brugernavn = '$form_user' AND password = '$form_pass'"); //Spørger efter ID
    $number = mysql_num_rows($resultat);//Tæller antaller af resultater

    if($number == 1) {
        extract(mysql_fetch_array($result));
        $_SESSION['adgang'] = "true";
        $_SESSION['status'] = $status;
        $_SESSION['brugernavn'] = $form_user;
        $_SESSION['navn'] = $navn;
        header("location: enurl");
        exit;   
    }
    else {
        header("location: index.php");
        exit;
    }
?>

Din else if ($result != 1) er rimelig unødvendigt, for der burde ALDRIG forekomme mere end 1 bruger med samme brugernavn. ;)

derhar har jeg fjernet if ($result != 1) fra den. ;)

Håber det kan bruges, eller i det mindste givet dig lidt vejledning til bedre sikkerhed og optimering af din kode. ;)

- BlackScorpion.
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 08:22 #6
hov mangler lige: $_SESSION['brugerensid'] = $bId;

:)
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 09:32 #7
og du burde nok også overveje noget kryptering på kodeordet, såsom enten md5 eller sha-1.
Avatar billede bmdk Nybegynder
17. maj 2008 - 12:14 #8
Hej blackscorpion og mange tak for din hjælp! :)

Jeg har bare det problem, at hvis jeg kun bruger én SQL query, så kan jeg ikke bruge navn, brugerensid m.v. - det eneste jeg kan bruge er $_SESSION['brugernavn'], $_SESSION['status'] og $_SESSION['adgang'] - alle andre ignorerer den bare. Har prøvet at udskrive navn og brugerensid på min index for at teste det, men den udskriver intet. Udskriver jeg derimod brugernavn, så virker det fint?
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 12:21 #9
Har du husket at rydde cachen og genstartet din browser ? ;)
Avatar billede bmdk Nybegynder
17. maj 2008 - 12:24 #10
Har ihvertfald husket at genstarte min browser :) det gør jeg næsten hver gang jeg skal teste noget hehe
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 12:25 #11
okey prøv lige at rette følgende:

$_SESSION['access'] = true;
$_SESSION['stat'] = $status;
$_SESSION['user'] = $form_user;
$_SESSION['name'] = $navn;

og så prøv at udskrive tingene fra databasen.
Avatar billede bmdk Nybegynder
17. maj 2008 - 12:32 #12
nope, samme problem :( den kan godt udskrive brugernavnet (user), men ikke name..
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 12:41 #13
hmm virker som om du intet får ud fra databasen..

smid lige /* */ rundt om hele din if, og skriv følgende:

while($content = mysql_fetch_array($result)) {
extract($content);
  echo $bId." - ".$status." - ".$navn." - ".$number."<br>\n";
}

og fortæl mig hvad den skriver.
Avatar billede bmdk Nybegynder
17. maj 2008 - 12:46 #14
Den skriver intet overhovedet.. underligt! :/
Avatar billede bmdk Nybegynder
17. maj 2008 - 12:47 #15
Sådan her ser min login fil ud nu

    session_start();
    require_once("classes/dbconn.php");
    $db = new DbConnector();
    $db->connect();

      $form_user = trim(htmlspecialchars($_POST['brugernavn']));
    $form_pass = trim(htmlspecialchars($_POST['kodeord']));

    if(empty($form_user) || empty($form_pass)) { // tjekker at ingen af felterne er tomme.
    header("Location: index.php"); // sender brugeren tilbage hvis et tomt felt er fundet.
    exit;
    }

    $resultat = mysql_query("SELECT bId, status, navn FROM brugere WHERE brugernavn = '$form_user' AND password = '$form_pass'"); //Spørger efter ID
  // $number = mysql_num_rows($resultat);//Tæller antaller af resultater

    while($content = mysql_fetch_array($result)) {
      extract($content);
      echo $bId." - ".$status." - ".$navn." - ".$number."<br>\n";
    }
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 12:47 #16
post lige HELE dit script.
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 12:48 #17
okey 4 sekunder for langsom :P
Avatar billede bmdk Nybegynder
17. maj 2008 - 12:49 #18
Hehe, det er okay ;)
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 12:50 #19
og du er 100% sikker på at din forbindelse til mysql virker ?
og du er 100% sikker på at brugernavn og kodeord er korrekt, og findes i databasen ?
og du HAR husket <?php og ?> ? (skal spørge)
Avatar billede bmdk Nybegynder
17. maj 2008 - 12:52 #20
<? og ?> har jeg husket ;)

er 100% på at både brugernavn og kodeord er korrekt og findes i db.

Ja, min forbindelse burde virke, ellers kan den vel ikke liste alle profiler på profil siden? :)
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 12:55 #21
smid lige "or die(mysql_error());" uden ", efter din mysql_query...

ellers så må du lige lave et hurtigt dump at din database struktur, og så kigger jeg på det når jeg kommer hjem fra job om 8 timer give or take.
Avatar billede bmdk Nybegynder
17. maj 2008 - 13:03 #22
Og den udskriver bare stadig intet :( Det er sygt underligt, at den ellers godt kan finde ud af, at brugerens status er sat til 0 eller 1 i DB'en, men den kan ikke finde ud af navn m.v.

Anyway, har lige lavet et screenshot til dig af min DB: http://www.bo-mortensen.dk/db.JPG

I øvrigt synes jeg vi skal finde ud af noget med, at du får nogle points af mig for det her :) det er sgu en stor hjælp!
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 13:05 #23
okey jeg kan se at der er nogle ting vi skal have gennemgået som du SKAL ændre hvis den skal være offentlig på nettet. :P

smid lige din msn, så tilføjer jeg dig i aften, hvis du har tid, og så tager vi lige et kig på det der.. for noget er rusk ravende galt.
Avatar billede bmdk Nybegynder
17. maj 2008 - 13:08 #24
Haha, det har du nok helt ret i ;) normalt er jeg vant til at programmere Java, så PHP er et helt nyt emne for mig.

Min msn er: mail@bo-mortensen.dk - er hjemme hele dagen/aftenen :)
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 13:11 #25
hahahahahaha!!!

må har begge brug for briller. :P

$resultat = mysql_query("SELECT bId, status, navn FROM brugere WHERE brugernavn = '$form_user' AND password = '$form_pass'"); //Spørger efter ID

while($content = mysql_fetch_array($result)) {

Hvad er der forkert ved disse 2 linier ? :D
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 13:14 #26
og jeg har brug for en staveged... "må har begge brug for briller. :P" skulle selvfølgelig være "vi har begge brug for briller. :P" hehe.
Avatar billede bmdk Nybegynder
17. maj 2008 - 13:15 #27
ahh fuck haha.. prøver lige igen ;)
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 13:17 #28
:P

elsker når man er vant til engelsk at andre så kører dansk. ;)

det burde du også tilvænne dig. :P
Avatar billede bmdk Nybegynder
17. maj 2008 - 13:18 #29
Således kom det til at virke!

MANGE tak for hjælpen :) fuck det var nice.

Skal jeg ikke lige oprette et nyt spørgsmål der hedder "point til blackscorpion"? Så smider jeg lige nogle points efter dig nemlig.
Avatar billede bmdk Nybegynder
17. maj 2008 - 13:19 #30
Ja, vi skriver normalt også engelsk på min uddannelse hehe, ved ikke hvorfor jeg lige har brugt dansk her egentlig. Det er lidt tåbeligt ;)
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 13:19 #31
skal lige høre, tog du det første script jeg postede ?
Avatar billede bmdk Nybegynder
17. maj 2008 - 13:20 #32
<?   
    session_start();
    require_once("classes/dbconn.php");
    $db = new DbConnector();
    $db->connect();

      $form_user = trim(htmlspecialchars($_POST['brugernavn']));
    $form_pass = trim(htmlspecialchars($_POST['kodeord']));

    if(empty($form_user) || empty($form_pass)) { // tjekker at ingen af felterne er tomme.
    header("Location: index.php"); // sender brugeren tilbage hvis et tomt felt er fundet.
    exit;
    }

    $resultat = mysql_query("SELECT bId, status, navn FROM brugere WHERE brugernavn = '$form_user' AND password = '$form_pass'") or die(mysql_error()); //Spørger efter ID
    $number = mysql_num_rows($resultat);//Tæller antaller af resultater

  if($number == 1) {
        extract(mysql_fetch_array($resultat));
        $_SESSION['access'] = true;
        $_SESSION['stat'] = $status;
        $_SESSION['user'] = $form_user;
        $_SESSION['name'] = $navn;
        $_SESSION['brugerensid'] = $bId;
        header("location: index.php");
        exit;   
    }
    else {
        header("location: index.php");
        exit;
    }

?>

Det der virker :)
Avatar billede bmdk Nybegynder
17. maj 2008 - 13:20 #33
Men.. det er simpelthen fordi session variablen ikke må hedde det samme, som db variablen? eller?

sådan her: $_SESSION['navn'] = $navn;
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 13:30 #34
mener at kunne huske noget med en setting i php.ini som gjorde at du faktisk kunne kalde sessions, ved variable navn, i dit tilfælde.. navn, status og adgang.

en anden ting.. åbn phpmyadmin, åbn din brugere tabel, rediger dine inputs, og smid md5 på.. du kan læse mere om md5 her: http://www.eksperten.dk/artikler/1051

og så ændrer du :
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 13:30 #35
hov... så ændrer du:

$form_pass = trim(htmlspecialchars($_POST['kodeord']));

til

$form_pass = md5(trim(htmlspecialchars($_POST['kodeord'])));
Avatar billede bmdk Nybegynder
17. maj 2008 - 13:38 #36
Hmm, nu spørger jeg nok dumt, men kan det passe jeg ikke kan vælge md5 nogen steder i min db? Redigerer f.eks. password feltet, men der er kun:

Feltnavn | Datatype | Længde/værdi | Kollation (Collation)| Attributter | Null værdi | Standardværdi | Ekstra
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 13:41 #37
http://www.bo-mortensen.dk/db.JPG

som her på.

tryk på penslen i venstre side.. ved kodeordet, står der "type" mener jeg... så kan ud vælge alle mulige ting.. bla. md5.
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 13:47 #38
http://www.lensenergy.com/weblog/images/FixingMTAuthorPWInmySQL2.png

Der kan du se det... og netop author_password sætter han til "encrypt".. lige præcist der, skal du så bare vælge md5. ;)
Avatar billede bmdk Nybegynder
17. maj 2008 - 13:51 #39
Ahh, skulle lige være med :D

Men det er så kun brugernavn og password, der skal være md5, ikke?
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 13:53 #40
nej kun kodeord. :)

når du så opretter smider du md5() rundt om, før du smider det i databasen.
når du så tjekker.. så smider du md5() rundt om det kodeord brugeren har tastet, og tjekker det i databasen. ;)

md5() generer en 32 tegns hash værdi af ordet.

men læs den artikel jeg linkede til tidligere, den er ret nyttet og forklarer rigtigt godt hvordan og hvorledes omkring md5.
Avatar billede bmdk Nybegynder
17. maj 2008 - 13:54 #41
damn, nej det skulle vist kun være password haha :D ellers får man nogle sjove brugernavne!
Avatar billede bmdk Nybegynder
17. maj 2008 - 13:55 #42
Jep det vil jeg lige gøre ihvertfald :) takker igen.

Opretter lige det spørgsmål så du kan få points!
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 13:56 #43
lige præcist, og da folk har det med at genbruge deres kodeord på alle de forskellige ting de bruger, er det nok smartest at du ikke kan se deres kodeord. :P

dvs, at hvis de skulle glemme det, så skal der laves et nyt til dem, for du kan IKKE vende md5 funktionen.. altså fra md5 -> tekst..

md5 er en én-vejs kryptering.
Avatar billede bmdk Nybegynder
17. maj 2008 - 14:01 #44
Yep oki :)

Øh, dvs at folk skal gå og huske på passwords som f.eks. 098f6bcd4621d373cade4e832627b4f6 ? :P
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 14:04 #45
nej nej... læs den artikel, han forklarer det hele. ;)

hvis nu hest blev til 098f6bcd4621d373cade4e832627b4f6 når det var fræset igennem md5, så ville brugeren huske på hest, men databasen ville huske på 098f6bcd4621d373cade4e832627b4f6.

når brugeren så skal tjekkes.. så er det simpelt..

$md5_pass = md5($_REQUEST['user_submitted_password']);

og vups.. så kan brugeren og databasen snakke sammen. ;)
Avatar billede bmdk Nybegynder
17. maj 2008 - 16:05 #46
Sorry jeg ik lige har svaret - var lige på shopping tur hehe.

Har fundet ud af det med md5 nu :)

Jeg laver lige det spørgsmål så du kan få points, det kommer til at hedde "points til blackscorpion. Smider i PHP sektionen.
Avatar billede blackscorpion Nybegynder
17. maj 2008 - 16:08 #47
har allerede svaret. :P
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