/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Hvorfor ødelægger querystrings sessions??
Fra : Jakob Munck


Dato : 02-12-05 01:12

Jeg har fundet noget, som jeg synes er meget mærkeligt. Men der er sikkert
en forklaring, som jeg bare ikke kender:

I en portal jeg er ved at lave logger medlemmerne sig ind, og når de gør
det laves der en session me deres id-nummer, som så senere bruges til at
kontrollere hvem der kan besøge hvilke sider. Det virker udmærket, men kun
når der ikke aktiveres querystrings med den samme betegnelse som de nævnte
sessions, for hvis det sker, så overskriver querystrengens værdi den værdi,
som den omtalte session har!. Session er altså ikke uafhængige af
querystrings, men kan ændres gennem disse. Det synes jeg er meget mærkeligt
og jeg vil godt finde en metod til at undgå det.

Sådan skriver jeg en session:
$_SESSION['id'] = $id;

Sådan kan jeg lave en (ofte) querystring:
<a href='profile_show.php?id=$data[id]'>$data[name]</a>

Spørgsmål:

- Er querystrings og sessions i virkeligheden det samme?

- Hvordan gør man, så det at aktivere en querystring IKKE påvirker
eventuelle sessions med det samme navn?

v.h.
Jakob



 
 
Jesper H (02-12-2005)
Kommentar
Fra : Jesper H


Dato : 02-12-05 12:58

> Spørgsmål:
>
> - Er querystrings og sessions i virkeligheden det samme?

Short answer:
Nej

Long answer:
Når du skal tilgå variable fra en querystring, bruger du normalt
$_REQUEST['id'] eller $_GET['id'] som du så henter ind i din variabel,
f.eks.
<?PHP
$id = $_GET['id');
?>
Der er så vist også noget med, at hvis register_globals_on (eller
sådan noget, står i php_info(); ) er sat, så gør den automatisk
dette (altså tilskriver en variabel med indholdet af querystringen) -
og det kan være upraktisk, hvis du så nede i koden laver den med:
<?PHP
$_SESSION['id'] = $id;
?>
Så har du balladen, for så skifter din id på den person, der står
til at være logget ind, når vedkommende vælger at se en anden
persons profil.

>
> - Hvordan gør man, så det at aktivere en querystring IKKE påvirker
> eventuelle sessions med det samme navn?

Undersøger ovennævnte, retter i koden, eller poster koden her, så vi
kan debugge den

--
Mvh
Jesper, http://fdf.dk/landsdel1/


Jakob Munck (02-12-2005)
Kommentar
Fra : Jakob Munck


Dato : 02-12-05 13:30

Tak for dit svar. Så vidt jeg kan se er sessions og querystrings det samme,
forstået sådan at en variabel sat i en querystring ændringer indholder i en
variabel med samme betegnelse, som er sat med en session. Hvad formålet er
med at det virker på denne måde, ved jeg ikke. Umiddelbart virker det helt
tosset! Men den eneste måde man kan undgå det, er ved at kalde sine
sessions- og querystrings-variable forskellige navne. Så påvirker de nemlig
ikke hinanden.

v.h.
Jakob



Thomas Lindgaard (02-12-2005)
Kommentar
Fra : Thomas Lindgaard


Dato : 02-12-05 20:00

On Fri, 02 Dec 2005 13:29:34 +0100, Jakob Munck wrote:

> Tak for dit svar. Så vidt jeg kan se er sessions og querystrings det samme,
> forstået sådan at en variabel sat i en querystring ændringer indholder i en
> variabel med samme betegnelse, som er sat med en session. Hvad formålet er
> med at det virker på denne måde, ved jeg ikke. Umiddelbart virker det helt
> tosset! Men den eneste måde man kan undgå det, er ved at kalde sine
> sessions- og querystrings-variable forskellige navne. Så påvirker de nemlig
> ikke hinanden.

Sessions og query-strings har intet med hinanden at gøre. Dit problem
skyldes, at php-installationen på serveren har register_globals=on, dvs.
at form-input, session-variable og query-strings automagisk bliver lavet
til variable i dit script.

Altså en query-string ala den følgende:

http://server/script.php?hilsen=hej&tyksak=Gokke

giver dig variablene

$hilsen = 'hej';
$tyksak = 'Gokke';

i scriptet.

Hvis du så har en variabel $hilsen i din session sat til 'goddag', så
bliver den i stedet sat til 'hej'.

Det du skal gøre for at undgå problemet er:

1) at slå register_globals fra (hvis du har adgang til det - det sættes
i php.ini).
2) bruge de super-globale arrays: $_POST, $_GET, $_SESSION, m.fl.

Vælger du at bruge de super-globale arrays, så kan du i praksis være
mere eller mindre ligeglad med om register_globals er slået til eller ej.

Hvis register_globals=on, og du har dit link

<a href='profile_show.php?id=$data[id]'>$data[name]</a>

og session indeholder en variabel $id også, så vil værdien af $id være
den, som er angivet i query-stringen.

Du kan (og bør) omgå problemet ved altid at angive præcis, hvilken
variabel du henviser til. Dvs. hvis du f.eks. vil udskrive $id fra din
session

print "i session har id værdien $id";

så får du udskrevet noget forkert, hvis query-string indeholder samme
variabel. Hvis du i stedet præciserer

print "i session har id værdien {$_SESSION['id']}";

så får du den rigtige værdi.

Du er desuden ude over det problem, at din kode går i stykker, hvis det
bliver flyttet over på en server, hvor register_globals er slået fra.

Det blev til en længere stil, håber det hjalp.

--
Mvh.
/Thomas

Jakob Munck (03-12-2005)
Kommentar
Fra : Jakob Munck


Dato : 03-12-05 11:29

Mange tak for hjælpen. Jeg har læst lidt om dette problem, og - at dømme
efter manualen - er den letteste løsning at lave en htaccess-fil med
følgende indhold:

php_flag register_globals 0

Så er register_glabals slået fra på ens egen lokale site, uanset hvordan
serveren i øvrigt er indstillet.

Er der nogle svagheder ved denne løsning??


v.h.
Jakob



Martin (04-12-2005)
Kommentar
Fra : Martin


Dato : 04-12-05 03:17

Jakob Munck wrote:
> Mange tak for hjælpen. Jeg har læst lidt om dette problem, og - at dømme
> efter manualen - er den letteste løsning at lave en htaccess-fil med
> følgende indhold:
>
> php_flag register_globals 0
>
> Så er register_glabals slået fra på ens egen lokale site, uanset hvordan
> serveren i øvrigt er indstillet.
>
> Er der nogle svagheder ved denne løsning??

Ja hvis serveren ikke er sat til at bruge .htaccess

Dvs - under <directory> for din mappe skal der stå Override Allow eller
noget i den dur

Så hvis det er på din lokale server, så for guds skyld, så sæt lige
register_globals til off!

Jeg kender ingen webhoteller som kører den med on, og hvis du begynder
at smide dit site op på en server og register_globals er anderledes end
på din egen server, så skal du nok få sjove resultater.

>
>
> v.h.
> Jakob
>
>

--

Venlig hilsen
Martin


Jakob Munck (04-12-2005)
Kommentar
Fra : Jakob Munck


Dato : 04-12-05 08:57

>
> Ja hvis serveren ikke er sat til at bruge .htaccess
>
> Dvs - under <directory> for din mappe skal der stå Override Allow eller
> noget i den dur
>

Taler du her om php-info? Drejer det sig om at der under "Virtual Directory
Support" ikke må stå "disabled?

Eller er det et andet sted jeg skal læse om .htaccess bliver respekteret?


v.h.
Jakob



Henrik Stidsen (04-12-2005)
Kommentar
Fra : Henrik Stidsen


Dato : 04-12-05 15:04

Jakob Munck brought next idea :
> Eller er det et andet sted jeg skal læse om .htaccess bliver respekteret?

..htaccess hører til Apache serveren så det er i dens config fil du skal
se opsætningen

--
Henrik Stidsen - http://henrikstidsen.dk/



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste