Gå til innhold

[løst]Har begynt og få en rar errormelding med session_start()


Anbefalte innlegg

Hei!

 

Håper noen kan hjelpe meg. Jeg hadde skrevet ett logginnscript, som fungerte en stund til jeg av en eller annen grunn fikk denne meldingen:

 

Warning: Unknown: Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0

 

Tenkte at jeg hadde klussa til noe i scriptet, så lette etter feil men fant ikke noe. Skrev så scriptet på nytt og endte opp med samme error.

 

Sånn ser scriptet ut nå:

<?php
  session_start();
  ob_start();
  $root = dirname( __FILE__ );
  $domene = $_SERVER['SERVER_NAME'];
  include_once $root . '/funksjoner.inc.php';
  include_once $root . '/config.php';

  $tilkobling = mysql_connect($vert, $bruker, $passord); //Kobler til databasetjeneren
  mysql_select_db("$db", $tilkobling);//Velger database

  $tittel = tittel(6);
  function visSjema(){
   echo '<form method="POST" name="logginn" action="/logginn.php">
  ';
   echo '<table style="text-align: left;" 0="" cellpadding="2"';
   echo 'cellspacing="2">';
   echo '<tbody>';
   echo '<tr>';
   echo '<td>Login:</td>';
   echo '<td><input name="logginn" type="text"></td>';
   echo '</tr>';
   echo '<tr>';
   echo '<td>Passord</td>';
   echo '<td><input name="passord" type="password"></td>';
   echo '</tr>';
   echo '<tr>';
   echo '<td>Husk meg:</td>';
   echo '<td><input name="huskMeg" type="checkbox"></td>';
   echo '</tr>';
   echo '</tbody>';
   echo '</table><input type="submit" name="submit" value="Logg Inn">';
   echo '</form>';
  }

  if($_SESSION['innlogget'] == false){
   if(isset($_POST['submit'])){
	   //Fjerner HTML og SQL kode
	   $logginni = htmlentities($_POST['logginn']);
	   $passordi = htmlentities($_POST['passord']);
	   $nickii = mysql_real_escape_string($nicki);
	   $logginnii = mysql_real_escape_string($logginni);
	   $passordii = mysql_real_escape_string($passordi);
	   //Krypterer passordet
	   $passordSha1 = sha1($passordii);

	   //Sjekker om brukernavn/passord er riktig
	   $sql = "SELECT * FROM brukere WHERE logginn = '" . $logginnii . "' AND passord = '" . $passordSha1 . "'";
	   //var_dump($sql);
	   $resultat = mysql_query($sql, $tilkobling);
	   //var_dump($resultat);
	   $rad = mysql_fetch_row($resultat);//Behandler resulatet
	   //var_dump($rad);
	   if($rad != NULL){
		   if($_POST['huskMeg']==on){
			   setcookie("logginn", $logginnii);
			   setcookie("passord", $passordSha1);
		   }

		   $_SESSION['innlogget'] = true;
		   $_SESSION['brukernavn'] = $brukernavnii;
		   $_SESSION['gruppe'] = $rad['gruppe'];
		   echo 'Du er nå logget inn som ' . $logginnii;

			//Lager tittel
			$sql = "SELECT * FROM sider WHERE sideID = 5";
			$resultat = mysql_query($sql, $tilkobling);
			$rad = mysql_fetch_array($resultat);
			$tittel = $rad['tittel'] . $_SESSION['brukernavn'];
			echo $_SESSION['brukernavn'];
	   }else{
		   visSjema();
		   $onload = "popup('Feil login eller passord. Prøv igjen')";
	   }

   }else{
	   visSjema();
   }
  }else if($_SESSION['innlogget']==true){
   include "loggut.php";
  }
  $innhold = ob_get_clean();
  include $root . '/tpl/hoved.tpl';	
  ?>

 

Hvis jeg kommentere bort session_start(), så kommer ikke erroren, men man må jo bruke session_start for og jobbe med sessions?

Håper noen kan hjelpe meg. Takk til alle som hjelper meg.

Endret av Rockie
Lenke til kommentar
Videoannonse
Annonse

http://preetul.wordpress.com/2007/05/07/yo...-of-data-unles/

 

$_SESSION['gruppe'] = $rad['gruppe'];

Endre den til

$gruppeID = $rad['gruppe'];
$_SESSION['gruppe'] = $gruppeID;

Er ikke sikkert at det er akkurat der feilen ligger, men jeg kan ikke se noe annet.

 

 

Så litt annen kritikk.

  • Fnutter rundt variabler er unødvendig ("$db" ....)
  • method="POST" skrives i lowercase. method="post"
  • Bruk echo <<< EOF ... EOF; istede for slik du gjør nå. Ingen store forskjeller, unntatt lesbarheten.
    echo <<<EOF
    Masse
    HTML 
    output her. Med {$variabler} tilogmed.
    EOF;


  • Sette "i" etter variablene er unødvendig.
    $logginn = htmlentities($_POST['logginn']);
    	 $passord = htmlentities($_POST['passord']);
    	 $nick = mysql_real_escape_string($nick);
    	 $logginn = mysql_real_escape_string($logginn);
    	 $passord = mysql_real_escape_string($passord);
    $passordSha1 = sha1($passord);


    Fungerer like bra. Kan tilogmed gjøre alt i en omgang.

    $logginn = mysql_real_escape_string( htmlentities( $_POST['logginn'] ) );
    	 $passord = sha1( mysql_real_escape_string( htmlentities( $_POST['passord'] ) ) );
    	 $nick = mysql_real_escape_string( htmlentities( $nick );


  • if($rad != NULL){


    Bruk mysql_num_rows( $resultat ) istede.

  • if($_POST['huskMeg']==on)


    Mangel på fnutter rundt "on".

Lenke til kommentar

Ok, takk for alle hjelpen. Det med fnuttene vet jeg, henger tilbake fra noe gammel kode som jeg mp rydde opp i. Det med de i'en har jeg lagt inn med vilje for at det skulle bli litt ryddigere, men har tenkt og fjerne de. Skal se om det hjelper nå.

 

Edit: Det fungerte ikke :( Skal se litt mer på det.

 

Edit 2: Det ser ut som om det er noe med php på min maskin, siden fungerer på serveren alt skal flyttes til.

 

Edit 3: Får ikke erroren lengre, verken i loggen eller på siden, men den vil ikke registrere Sessions allikevell ser det ut som.

Endret av Rockie
Lenke til kommentar

Sett session.bug_compat_42 og session.bug_compat_warn til av. Har du register_globals på, så bør det skrus av også.

 

Noen kode feil og tips:

 

$_SESSION['innlogget'] er ikke definert når du prøver å bruke den første gang (men ser ut til å virke).

if($_SESSION['innlogget'] == false){
...
}else if($_SESSION['innlogget']==true){

 

Prøv noe slikt som følgende istedenfor for mer klar kode.

$isLoggedIn = isset($_SESSION['innlogget']) && $_SESSION['innlogget'];
if ($isLoggedIn) {
//logget inn og autorisert
} else {
//vis login skjema
}

 

 

Kan ikke se at $brukernavnii er definert før du prøver å bruke den. Kanskje du skal bruke $nickii ?

 $_SESSION['brukernavn'] = $brukernavnii;

 

Skriveleifer i navn på funksjoner vil plage deg til evig tid (eller så lenge som du bruker koden, som alltid viser seg å være lengre enn du trodde).

function visSjema(){

 

Du bør ikke escape html før du skal skrive ut til en html side. Det kan være du vil bruke teksten i tekstepost, tekstfiler, javascript alert/confirm/popup addslashes(html_entities_decode($brukernavn)), url query urlencode(html_entities_decode($brukernavn)), en klient som ikke er skrevet for web, etc.

Nå er disse variablene fra databasen html escapet, men vet du alltid hvor disse variablene kommer fra? Er alle variabler html escapet? Det blir en lang liste å holde orden på hvilke variabler som er escapet og hvilke som ikke er det.

		  //Fjerner HTML og SQL kode
	  $logginni = htmlentities($_POST['logginn']);
	  $passordi = htmlentities($_POST['passord']);
/*snip*/
	  //skriver ut login escapet for sql. Det gjelder å holde tungen rett i munnen :)
	  echo 'Du er nå logget inn som ' . $logginnii;

Du burde ikke skrive ut login hvis brukeren har en annen variabel som inneholder brukernavn. Ikke skriv ut passord heller. :)

 

Bare husk at nå er alle passord html escapet også (hvis det er noen i databasen), så skal noen autentiseres fra andre steder enn via din php klient i fremtiden må de også escape eventuelle html entities i passordteksten. Anbefaler deg å lage et script som går gjennom listen og fjerner denne escapingen.

 

For mer sikkerhet: legg til et langt salt per bruker og/eller et felles salt for applikasjonen (salt er en [lang] tekststreng som legges til passordet før det hashes). Du bør også kreve minimum lengde (8+ bokstaver), med bokstaver, tall og tegn, og gjerne sammenligne med en liste over mest brukte passord (slik som passord og 7777777).

 

$_SESSION['gruppe'] = $rad['gruppe'];

Endre den til

$gruppeID = $rad['gruppe'];
$_SESSION['gruppe'] = $gruppeID;

Er ikke sikkert at det er akkurat der feilen ligger, men jeg kan ikke se noe annet.

Dette var ikke en feil så vidt eg ser. Ville foretrukket den orginale koden akkurat på den linjen.

 

method="POST" skrives i lowercase. method="post"

Teksten er case-insensitiv. Både for html og xhtml.

Endret av OIS
Lenke til kommentar

Takk. Skal se på det du har sagt, men fikk fjerna den erroren. Skrev hele scripet på nytt med en del andre forbedringer.

 

Det med POST og GET i store bokstaver er bare en vane jeg har. Det fungerer så why not :p

 

Takk for all hjelp :D Skal se på de tipsene de kom med.

Endret av Rockie
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...