Avatar billede fhansen Praktikant
17. juni 2007 - 22:18 Der er 17 kommentarer og
1 løsning

Session ved login fungere ikke for alle brugere

Hejsa allesammen.

Jeg har haft stillet dette spørgsmål før, men uden at få løst mit problem, så nu vil jeg lige prøve igen.

Jeg har lavet nedenstående login, koden har jeg fundet på nettet, og så skrevet det en del om, efter min bedste overbevisning.
Problemmet er at login ikke fungere for alle brugere, og jeg forstår ikke hvorfor.
De brugere der har problemmer overlever login'et på flg. måde..
Når de indtaster deres brugernavn og password i Bruger.php bliver de budt velkommen og får deres vagtdag oplyst, det fortæller mig at bruger.php og settings.php fungere, og det fortæller også at sessions bliver sat i settings.php.
Men når de så forsøger at åbne en side der kræver login, returnere function check_login() false, svarende til at de forskellige sessions ikke er sat eller er blevet destroyet, dette bliver bekræftet hvis forsøger med print_r($_SESSION).

Jeg håber der nogen der kan hjælpe mig på rette spor.

Hilsen


Finn


bruger.php
<?php
$dbhost = "host";
$dbuser = "user";
$dbpass = "password";
$database = "database";
include("Lockfiles/settings.php");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
function setlogin(login){
location.href='set.php?login='+login+''};
</script>

<style type="text/css">
<!--

#Layer2 {
    position:absolute;
    left:0px;
    top:0px;
    width:200px;
    height:185px;
    z-index:2;
}
#Layer3 {
    position:absolute;
    left:0px;
    top:0px;
    width:200px;
    height:185px;
    z-index:2;
}
.style5 {
    color: #FFFFFF;
    font-weight: bold;
}
body,td,th {
    font-family: Tahoma;
    color: #FFFFFF;
    font-size: 12px;
}
a:visited {
    color: #FFFFCC;
}
.style7 {font-size: 14px}
-->
</style>
</head>

<body>

<?
if (isset($_COOKIE['logg'])) {
    $chk = 'checked';
}else{
    $chk = '';   
}

if(false == check_login()){
?>
<div id="Layer2" style="background-image:url(Images/Login.gif); filter:alpha(opacity=40);-moz-opacity:.4;opacity:.4;"></div>
<div id="Layer3">
<?
if(isset($_SESSION["besked"])) {
echo $_SESSION["besked"];
unset($_SESSION["besked"]);
}
?>
<table width="200" border="0" cellspacing="1" >
<form action="<? echo $_SERVER['PHP_SELF']; ?>" method="post" class="style7">
  <tr>
  <td colspan="4" height="15"></td>
  </tr>
  <tr>
    <td width="10%" rowspan="8"></td>
    <td width="85%" colspan="2" ><span class="style5">Login:</span></td>
    <td width="5%" rowspan="8"></td>
  </tr>
  <tr>
    <td colspan="2">Brugernavn</td>
    </tr>
  <tr>
    <td colspan="2"><input type="text" name="brugernavn" id="brugernavn" value="<? echo $logg[0] ?>"></td>
    </tr>
  <tr>
    <td colspan="2">Password</td>
    </tr>
  <tr>
    <td colspan="2"><input type="password" name="password"  id="password" value="<? echo $logg[1] ?>"></td>
  </tr>
  <tr>
    <td>
      <input type="submit" value="Login" name="login"></td>
    <td><a href="Loginhelp.html" target="Contents" onMouseOver="window.status='Klik på spørgsmåltegnet, for at få hjælp !'; return true"  onmouseout="window.status=''; return true"><img src="Images/question.gif" border="0"></a></td>
  </tr>
  <tr>
    <td colspan="2"><a href="fguser.php" target="Contents">Har du glemt dit password ?</a></td>
  </tr>
</form> 
</table>
</div>
<?
 
}else{

// Brugeren er logget ind, lav en log ud knap
?>
<div id="Layer2"  style="background-image:url(Images/Logout.gif);  filter:alpha(opacity=60);-moz-opacity:.6;opacity:.6;"></div>
<div id="Layer3" >

<table width="200" border="0" cellspacing="1" align="center">
<form action="<? echo $_SERVER['PHP_SELF']; ?>" method="post">
  <tr>
    <td rowspan="12" width="5%"></td>
    <td width="90%" height="10"></td>
    <td rowspan="12" width="5%"></td>
  </tr>
  <tr>
    <td ><div align="center">Velkommen</div></td>
    </tr>
  <tr>
    <td><div align="center"><? echo $_SESSION["Navn"]; ?></div></td>
    </tr>
  <tr>
      <td height="8"></td>
    </tr>   
  <tr>
      <td align="center" ><span class="style7">HUSK DIN VAGTDAG</span></td>
    </tr>   
  <tr>
      <td align="center"><span class="style7"><? echo $_SESSION["Vagt"]; ?></span></td>
    </tr>           
  <tr>
    <td><div align="center">
      <input name="logud" type="submit" value="Log ud" onClick="
    parent.document.getElementById('Contents').src = 'HavnenA.html';">
    </div></td>
    </tr>
  <tr>
    <td align="center" height="8"></td>
    </tr>
       
  <tr>
    <td align="center"><? echo '<input type="checkbox" name="chkbx2" value="1" onclick="setlogin(\''.$_SESSION["No"].'\');"' . $chk . '>';?><label>Husk mig!</label> </td>
    </tr>
  <tr>
    <td align="center" height="8"></td>
    </tr>       
  <tr>
    <td align="center">
    <? if($_SESSION["Admin"] == 1){ echo '<a href="Lockfiles/admin.php" target="Contents">Administrator</a>';}?>    </td>
    </tr>
</form>   
</table>

</div>

<?
} // end false tjek_login
?>
</body>
</html>

settings.php
<?php

session_start();

function check_login() {
    if(isset($_SESSION["user"], $_SESSION["ip"]) && $_SESSION["ip"] == $_SERVER["REMOTE_ADDR"]) {
    return true;
    }
return false;
}

function login($brugernavn,$password){
    global $dbhost;
    global $dbuser;
    global $dbpass;
    global $database;
   
        $db = @mysql_pconnect($dbhost, $dbuser, $dbpass) or die ("Kunne desværre ikke forbinde til databasen!  ".$dbuser);
        @mysql_select_db($database, $db) or die ("Kunne desværre ikke forbinde til valgte database!");
        $sql = 'SELECT s.Id, s.Nummer,s.Login, s.Password, s.Navn, s.Admin, b.Berth, b.Vagt FROM sejler s
              LEFT JOIN berth b ON s.Nummer = b.Client
              WHERE Login = \''.$brugernavn.'\' AND Password = \''.$password.'\'';
        $check = mysql_query($sql) or die ("Sql fejl" );
       
        if(mysql_num_rows($check) != 0){
       
        $users = mysql_fetch_array($check);
          if ($users['Berth'] <= ''){
            $sql = 'SELECT s.Id, s.Nummer,s.Login, s.Password, s.Navn, s.Admin, b.Berth, b.Vagt FROM sejler s
              LEFT JOIN berth b ON s.Nummer = b.Lejer
              WHERE Login = \''.$brugernavn.'\' AND Password = \''.$password.'\'';
              $check = mysql_query($sql) or die ("Sql fejl" );
              $users = mysql_fetch_array($check);
          }       

            $_SESSION["user"] = $brugernavn;
            $_SESSION["ip"] = $_SERVER["REMOTE_ADDR"];
            $_SESSION["Navn"] = $users['Navn'];
            $_SESSION["No"] = $users['Nummer'];
            $_SESSION["Plads"] = $users['Berth'];
            $_SESSION["ClId"] = $users['Id'];
            $_SESSION["Admin"] = $users['Admin'];
            $Vagt = $users['Vagt'];
            $Vagt1 = split('
  • ',$Vagt);
            setlocale(LC_TIME,"dk_DK");
            $_SESSION["Vagt"] = strftime("%A %d-%m-%Y", mktime(0,0,0,$Vagt1[1],$Vagt1[2],$Vagt1[0]));
            $date = date('d-m-Y');
            $date = split('
  • ',$date);
            $_SESSION["Date"]= mktime(0,0,0,$date[1],$date[0],$date[2]);
            return true;
            }else{
            $_SESSION["besked"] = "Ingen bruger fundet";
            return false;
           
        }
}


$default_text = "Forkert bruger og/eller password!!!";

if(isset($_POST["logud"])) {
    $_SESSION = array();
    session_destroy();
    global $logg;
    unset($logg);
}

if(isset($_POST["login"])) {
    if(($_POST["brugernavn"] > "" ) && ($_POST["password"] > "")) {
    login($_POST["brugernavn"],$_POST["password"]);
    }
}


?>


Nedenstående function, bliver bruger til at check login.

include("settings.php");
if (check_login() == false){
include("error.html");
exit;

} else {
   
}
Avatar billede jakobdo Ekspert
18. juni 2007 - 08:03 #1
Husker du: session_start(); i toppen af de sider du leger med sessions i?
Avatar billede fhansen Praktikant
18. juni 2007 - 10:44 #2
Ja det skulle være ok, jeg includere jo settings.php, hvor jeg kalder session_start().
Det pudsige er jo at det virker for nogle bruger, og ikke for andre.
Avatar billede fhansen Praktikant
19. juni 2007 - 00:13 #3
Slet ingen der kan sige om der er en fejl i min kode ???
Avatar billede jakobdo Ekspert
19. juni 2007 - 07:50 #4
De færreste herinde gider at kigge flere sider kode igennem, for at finde en fejl som opstår midlertidigt. Desværre.

Det svarer lidt til at POSTE en høstak og bede nogen om at finde nålen. :o)
Avatar billede fhansen Praktikant
19. juni 2007 - 10:13 #5
*SS*

Det kan jeg nu godt forstå.
Men hvad pokker gør jeg, jeg kan ikke forstå hvorfor mine session() bliver destroyed.
Kan brugeren have nogle sikkerhedsindstillinger der gør at session() ikke fungere.

Hilsen

Finn
Avatar billede jakobdo Ekspert
19. juni 2007 - 10:18 #6
Bruger du iframes nogle steder?
Jeg mener at have set andre, hvor deres sessions blev ødelagt, da de arbejdede med sessions.
Avatar billede fhansen Praktikant
19. juni 2007 - 17:06 #7
Ja det gør, måske endda i stor stil.
Avatar billede jakobdo Ekspert
19. juni 2007 - 21:09 #8
Er det din egen side som kaldes i den iframe?
Har du husket session_start() i toppen af den side?
Avatar billede fhansen Praktikant
19. juni 2007 - 23:57 #9
Ja det er min egen side, nej jeg har ikke session_start() på siden, men det er med på siden der bliver includeret.

Det er kun få brugere der har problem med login.

Mit check af login ser sådan ud, denne kode stump ligger øverst på alle sider der kræver login.

<?php
include("settings.php");
if (check_login() == false){
include("error.html");
exit;
} else {
   
}

Og settings.php ser sådan ud

<?php

session_start();

function check_login() {
    if(isset($_SESSION["user"], $_SESSION["ip"]) && $_SESSION["ip"] == $_SERVER["REMOTE_ADDR"]) {
    return true;
    }
return false;
}
Avatar billede jakobdo Ekspert
20. juni 2007 - 07:15 #10
Det ser godt ganske godt ud.
Men du må jeg evt. udbygge din check_login funktion, så du f.eks. laver:

<?php

session_start();

function check_login()
{
    $errors = array();
    if(!isset($_SESSION["user"]))
    {
        $errors[] = 'USER ISSET ERROR';
    }
    if(!isset($_SESSION["ip"]))
    {
        $errors[] = 'IP ISSET ERROR';
    }
    if($_SESSION["ip"] !== $_SERVER["REMOTE_ADDR"])
    {
        $errors[] = 'IP MATCH ERROR';
    }
    if(count($errors)>0)
    {
        echo '<!-- DEBUG INFO TIL ADMINISTRATOR -->'."\r\n";
        foreach($errors AS $error)
        {
            echo '<!-- '.$error.'-->'."\r\n";
        }
        return false;
    }
    else
        return true;
}
Avatar billede fhansen Praktikant
20. juni 2007 - 10:04 #11
Takker.

det er lidt svært for mig at checke hvad der sker, da min login function fungere på
alle de PC'er jeg har adgang til.

Men har nu lige fået at vide fra en bruger, der fejlen at han heller ikke kan anvende 'husk mig' function, han får at vide at han ikke er logget ind, han kunne dog ikke svare på om han havde blokeret for cookies.
En session() fungere vel som en cookie, og er derfor afhængig af sikkerhedsindstillingerne.
Avatar billede jakobdo Ekspert
20. juni 2007 - 10:19 #12
Når nu han får info om den ikke er logget ind, så bed ham lige kigge i source koden og giv din de info ovenstående kode lavede.
Ellers må du jo teste på hans computer.
Avatar billede fhansen Praktikant
20. juni 2007 - 23:12 #13
Du har ret jeg bør få haft på en af de Pc'er der laver fejl.
Avatar billede fhansen Praktikant
03. oktober 2007 - 22:43 #14
Hejsa.

Beklager at jeg har væk fra dette problem i længere tid, noget med for meget at lave og en del stjålet notebooks.
Men  nu har jeg fået ny PC.

Jeg har fundet problemmet, nemlig flg.
En del bruger, brugte links på andre hjemmesider, til at åbne min, desværre var det ene af disse links lavet således at hjemmesiden, blev åbnet i en frame på den hjemmeside der blev linket fra.
Så da linket fik ændret target, var problemmet løst.

Jeg deler meget gerne point ud for al den hjælp je har fået.
Avatar billede jakobdo Ekspert
04. oktober 2007 - 07:54 #15
Svar!
Avatar billede fhansen Praktikant
04. oktober 2007 - 09:04 #16
Takker for hjælpen
Avatar billede jakobdo Ekspert
04. oktober 2007 - 14:12 #17
Takker for point.
Avatar billede fhansen Praktikant
04. oktober 2007 - 18:04 #18
De er ærligt fortjent
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