Avatar billede showsource Seniormester
29. marts 2008 - 11:20 Der er 21 kommentarer og
2 løsninger

Brug af sessions, skidt/dårligt

Hej
Brug af sessions kan jo være vældig fint!

Men argumenter for IKKE at bruge sessions, hvad kan de være?
Avatar billede showsource Seniormester
29. marts 2008 - 11:27 #1
nåh, et mere konkret ex.

For at "skjule" javascript kode, kan sessions bruges.

Side som vises i browser:

<?php
session_start();
$_SESSION["noget"] = "whatever";
?>
<html><head><title>Test</title>

<script type="text/javascript" src="jstest.php"></script>


</head>
<body>

<script type="text/javascript">
vis('det virker');
</script>

</body></html>

jstest.php:

<?php
session_start();

if(!isset($_SESSION["noget"])) {
echo"";
}else{
?>

function vis(tekst) {

document.write("OK, "+tekst);
}

<?php

}

unset($_SESSION["noget"]);

?>

Jeg er godt klar over at hvis brugeren ikke har slået cookies til, vil det ikke virke.
Altså javascriptet vil aldrig vises.
Avatar billede w13 Novice
29. marts 2008 - 11:34 #2
En lille detalje først.. Følgende:
----------------------------------
if(!isset($_SESSION["noget"])) {
echo"";
}else{
?>

function vis(tekst) {

document.write("OK, "+tekst);
}

<?php

}
----------------------------------
Kunne med fordel ændres til:
----------------------------------
if(isset($_SESSION["noget"])){
?>

function vis(tekst) {

document.write("OK, "+tekst);
}

<?php

}
----------------------------------
Det er jo temmelig bøvlet og meningsløst, hvis koden mange gange skal sidde og udskrive "" (ingenting).

Hvad angår sessions-spørgsmålet, så bør du bestemt holde det på et minimum. De er gode at bruge, ja, men mange Sessions bruger mange af serverens resourcer - især hvis du har mange brugere, naturligvis.

Det kan sagtens løses uden sessions ved brug af javascript.

F.eks. sådan her:
----------------------------------
<html><head><title>Test</title>
<script type="text/javascript">
//Følgende linje kan evt. skrives med PHP
var noget=true;
</script>
<script type="text/javascript" src="jstest.php"></script>
</head>
<body>

<script type="text/javascript">
vis('det virker');
</script>

</body></html>

jstest.php:

function vis(tekst){
  if(noget){
    document.write("OK,"+tekst);
  }
}
Avatar billede showsource Seniormester
29. marts 2008 - 11:38 #3
Ja, det første er fordi det er "revet ud" af noget andet.

Den med at bruge javascript alene, havde jeg ikke lige tænkt på!
Men ville den være lige så sikker som ved brug af sessions?

Og har du nogen gode ideer til hvorfor man IKKE skal bruge sessions generelt?
Avatar billede showsource Seniormester
29. marts 2008 - 11:45 #4
"Men ville den være lige så sikker som ved brug af sessions?"

Nej, du vil få vist koden i browseren/downloade den, hvis du kalder filen direkte.
Avatar billede w13 Novice
29. marts 2008 - 11:47 #5
Nej, JavaScript vil altid kunne ændres af brugeren, så sikkerheden er ikke den samme.
Men hvis du har et stort site, som har mange af denne slags Session-løsninger, bør du nok overveje at finde en anden måde at gøre det på. Ud fra dit eksempel kan jeg dog på ingen måde vurdere, hvad det er sikkerhedsmæssigt, du vil.

De 2 vigtigste argumenter mod Sessions er, som vi begge har været inde på:
1) De kan slåes fra.
2) De bruger rigtig mange resourcer.

Disse 2 burde dog også være nok til, at man holder sig fra at overforbruge dem.

Denne artikel er ganske vist om ASP-sessions, men problemstillingen skulle være den samme: http://www.aspfaqs.com/aspfaqs/ShowFAQ.asp?FAQID=75

Bare det at man slår Sessions til med session_start(); forringer Serverens ydeevne, så når du ikke bruger Sessions, bør du bestemt ikke slå dem til.
Avatar billede mstorgaard Praktikant
29. marts 2008 - 11:48 #6
Kan man så ikke bare bruge AJAX til at hente en bestemt PHP-side ud, hvis "noget == true", og så bare forhindre adgang til de sider, hvis ikke de bliver inkluderet på netop denne side?
Avatar billede w13 Novice
29. marts 2008 - 11:49 #7
For at gøre jstest.php mere sikker, kunne man muligvis bare foretage samme PHP-test, som når du sætter din Session. F.eks. hvis Session'en kun skal sættes, hvis brugeren er logget ind, så drop Session'en og tjek i stedet i jstest.php om brugeren er logget ind - helt uden session.
Avatar billede mstorgaard Praktikant
29. marts 2008 - 11:50 #8
Eller vil det ikke være lige så sikkert at have en md5-hashet version af brugernavn og adgangskode liggende som en GET, og så tjekke hver gang siden bliver åbnet? Det kan godt være adresselinjen bliver grim, men det er vel til at leve med? Eller trækker dette mange resourcer/er usikkert?
Avatar billede w13 Novice
29. marts 2008 - 11:52 #9
mstorgaard>> Det _kunne_ løse det, men jeg er sikker på, det ville kunne løses bedre, afhængigt af, hvad koden skal kunne.
En md5-hashing for hver side ville nok være mindst ligeså slemt resourcemæssigt som at bruge Sessions.
Avatar billede mstorgaard Praktikant
29. marts 2008 - 11:55 #10
Hvor svært er det for en bruger at ændre i en session? Jeg mener, om det er meget nødvendigt at tjekke indholdet af en session, hver gang man opdaterer en side.
Avatar billede w13 Novice
29. marts 2008 - 11:56 #11
Det vil helt sikkert kunne laves bedre/sikrere. ;)
Avatar billede showsource Seniormester
29. marts 2008 - 12:04 #12
Ok, nu var det nu ikke på en "megasite" jeg tænkte på, men generelt hvad ulempen er ved brug af sessions.
Selv vil jeg begrænse brugen så meget som muligt, og bliver det for stort ryger det i en mysql db i stedet
Avatar billede showsource Seniormester
29. marts 2008 - 12:05 #13
Og så er jeg sgu nødt til at ta' på job!
Avatar billede sjh Nybegynder
30. marts 2008 - 21:49 #14
showsource: Jeg forstår ikke helt dit spørgsmål / problem.

Argumenter for IKKE at bruge sessions, hvad kan de være ?
-> Det kan være, hvis du ikke har noget data som skal følge brugeren / klient.
Avatar billede sjh Nybegynder
30. marts 2008 - 22:02 #15
Hvis du vil bruge en session til at "skjule" et javascript, så drop det. Du kan ikke på nogle måde køre et javascript hos brugeren / klient uden at brugeren / klient skal hente den ned på sin computer, og der med kan brugeren / klient jo bare åbne filen og se din javascript kode.
Avatar billede sjh Nybegynder
31. marts 2008 - 09:57 #16
w13: Jeg gad godt at vide hvordan du vil lave nogle form for sikkerhed uden brug af session eller md5-hashing.

For jeg kan da ikke se at en md5-hashing er mere krævende end eventuel benytte noget sql-sjov eller hvad du ellers har i tankerne. ?
Avatar billede w13 Novice
31. marts 2008 - 12:40 #17
Nu ved jeg ikke, hvad showsource vil, men det lyder som om I har gennemskuet det bedre end jeg.

Hvis det drejer sig om login, er Session (nok) den bedste løsning, men det er kun fordi der i dét tilfælde kun vil være dén ene Session.

Dét, som jeg var imod i mstorgaards md5-forslag, var at lave noget sikkerhedshalløj med en md5 i adresselinjen. Dét er helt sikkert ikke den optimale løsning.
Avatar billede showsource Seniormester
01. april 2008 - 08:00 #18
Jeg tænkte på om der er noget som taler imod at bruge sessions.
F.eks. synes jeg at brugen af session id i url ikke er godt, brugervenlighed og sikkerhed
Og selvf. bør man kun bruge "serverside stuff" hvis det er nødvendigt.
Men mængden af resourcer som bruges ved sesssions, er den så stor som der snakkes om her?
Avatar billede w13 Novice
01. april 2008 - 11:23 #19
Hvis du bruger 200 på en gang, kan det godt mærkes. ;)
Og selvom du bruger mindre end det, kan det alligevel mærkes, når du har mange brugere.
Avatar billede showsource Seniormester
01. april 2008 - 12:00 #20
I må også gerne lige lægge nogle svar!
Avatar billede w13 Novice
01. april 2008 - 12:01 #21
:)
Avatar billede sjh Nybegynder
01. april 2008 - 16:55 #22
Ja nu behøver man jo ikke at bruge session_start() for at sette en session vadi hos brugeren, så vil det ikke være mere krævende end at sende et sessionid med _GET og stadivæk være mere sikkert, da det ville være svære for brugeren at ændre sessionid.

Jeg kan godt give et eksempel.

Her skal bruger skrive de bogstaver som står på billede, så vi skal vide hvad der skal stå.
Lav 2 filer captcha.php og index.php


<?php
  /* ------- captcha.php ------- */
  $time = time();
  $pasw = 'captcha password'; /* Et password som kun du kenner. (Samme password i filen index.php) */
  $captcha = '';
  $captchaord = 'ABCEFK23456789PQRTVY';

  while ( strlen($captcha) < 4 )
  {
    $ord = $captchaord[rand(0, 19)];
    if (!strstr($captcha, $ord))
    {
      $captcha .= $ord;
    }
  }

  /*
  Setter sessionid hos brugeren.
  Brug dem her, hvis der er behov for at slette session.
 
  header('Set-Cookie: captchaid=deleted; expires=Thu, 01-Jan-1970 00:00:00 GMT');
  */
  header('Set-Cookie: captchaid='.md5($_SERVER['REMOTE_ADDR'].$captcha.$pasw.$time).dechex($time).'; path=/; domain=.'.$_SERVER['SERVER_NAME']);

  /*
  Laver et billede med de bogstaver som brugeren skal skrive.
  Dette er KUN et eksempel, se beder metode her :
  http://www.softwaresecretweapons.com/jspwiki/watercap_strong_php_captcha_with_negative_spaces_and_shadows
  */
  header("Content-type: image/png");

  $im = @imagecreate(45, 20);
  $background_color = imagecolorallocate($im, 128, 128, 128);
  $text_color = imagecolorallocate($im, 200, 200, 200);
  imagestring($im, 5, 5, 2,  $captcha, $text_color);
  imagepng($im);
  imagedestroy($im);
  /* /------- captcha.php ------- */
?>

<?php
  /* ------- index.php ------- */
  $time      = time();
  $pasw      = 'captcha password'; /* Et password som kun du kenner. (Samme password i filen captcha.php) */
  $timeout  = 300; /* 5 minutter (Den tid en bruger må bruge på at udfylde formular, før der ikke kan postes med de nøgler som er sat.) */
  $remote    = $_SERVER['REMOTE_ADDR']; /* Brugerens IP-adresse */
  $captcha  = isset($_POST['captcha'])?$_POST['captcha']:''; /* De bogstaver som brugeren poster. */
  $captchaid = isset($_COOKIE['captchaid'])?$_COOKIE['captchaid']:''; /* Henter vores eget sessionid */

  $sisesid = substr($captchaid, 0, 32); /* Bogstaver pakket ind i en md5-hashing (captcha.php) */
  $sistime = hexdec(substr($captchaid, 32)); /* Tiden pakket ind i en hex (captcha.php) */

  if ($_SERVER['REQUEST_METHOD'] == 'POST' && $sisesid != '' && $sistime != '' && $captcha != '')
  {
    if ($sistime > ($time-$timeout) && $sistime < $time && $sisesid == md5($remote.$captcha.$pasw.$sistime))
    {
      echo '<pre>';
      print_r($_POST);
      echo '</pre>';
    }
  }
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title>Nyt Dokument</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <script type="text/javascript">
    window.onload = function()
    {
      if (document.cookie.length < 32)
      {
        alert('Din browser tilleder ikke session undersøgelse!');
      }
    };
    </script>
  </head>
  <body>
  <form action="<?=$_SERVER['PHP_SELF'];?>" method="post">
    Navn: <input type="text" name="name" value="" /><br />
    Captcha: <input type="text" name="captcha" value="" size="8" maxlength="4" />
    <img src="captcha.php?time=<?=time();?>" width="45" height="20" alt="" /><br />
    <input type="submit" value=" Send " />
  </form>
  </body>
</html>
<!------- index.php ------->


Når der så er posted, prøv så at trykke F5 og se, så kan der ikke postes med den nøgle igen.
Avatar billede showsource Seniormester
08. maj 2008 - 10:01 #23
Lukket, og tak for input
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