webForumDet fria alternativet

register_globals = on

19 svar · 453 visningar · startad av Skarre

SkarreMedlem sedan apr. 20012 427 inlägg
#1

Jag har nu konverterat nästa hela min webbplats från ASP till PHP och när jag nu gick igenom och testade lite så märkte jag att "register_globals" dessvärre är "on" på webbhotellet och det skapar problem i mina skript. Jag använder en sessionsvariabel ($_SESSION['userid']) och om jag råkar använda en variabel som heter $userid och ändrar dess värde så ändras även sessionsvariabeln med samma namn. Är detta ett normalt beteende när "register_globals = on" eller har jag missat någonting?

MatteMedlem sedan aug. 20002 975 inlägg
#2

Det är ett fullt normalt beteende. När register_globals är satt så är $_SESSION['variabel'] grovt sett samma sak som $variabel.
Att sätta ett värde i $variabel ändrar därmed värdet i sessionen.

register_globals betyder just att göra sessionsvariablerna "globala", alltså utanför arrayen, där array-index är variabelnamn.

Därför bör man vara noggrann att sätta ett unikt array-index, som inte används som array-index i andra Superglobala arrayer, eller som används som variabler.
Själv brukar jag lägga till sess_ i början på index för att ingen variabelkrock ska ske, typ $_SESSION['sess_variabel'].

SPiNMedlem sedan mars 20007 896 inlägg
#3

Du kan komma förbi det med att använda ini_set():
För att slå av register_globals:

ini_set( 'register_globals', '0' );

Sätt en 1:a som andra attribut för att slå på det igen. :)

SkarreMedlem sedan apr. 20012 427 inlägg
#4

Tack, Matte och Spin! Mycket nyttig information. Webbhotellet kommer att stänga av register_globals, men jag ska ta för vana att köra med ett prefix på sessionsvariablers namn hädanefter, så slipper man vara beroende av webbhotellets preferenser.

SkarreMedlem sedan apr. 20012 427 inlägg
#5

Jag testade även ini_set(), och det fungerade märkligt nog inte. Jag körde precis följande kod:

ini_set('register_globals','0');

session_start();
$_SESSION['foo'] = '123';

echo $_SESSION['foo'].'<br/>';
$foo = '789';
echo $_SESSION['foo'].'<br/>';

Resultatet blev följande:

123
789

MatteMedlem sedan aug. 20002 975 inlägg
#6

Får man fråga vad det är för webbhotell som vågar stänga av register_globals. :)

Det finns många gamla skript (och för den delen nya) liggande därute som är beroende av att register_globals är satt. Risken finns för många arga kunder om man gör denna åtgärd, det är därför flertalet (om inte alla) webbhotell har register_globals satt.

aleborgMedlem sedan jan. 20013 341 inlägg
#7

Det är avstängt nu!
Det är dålig programmering att behöva ha register_globals=on
Det är avstängt på prov nu, klagar för många så får vi sätta på det igen!

sebbzMedlem sedan juli 2000297 inlägg
#8

Skarre skrev:

Jag testade även ini_set(), och det fungerade märkligt nog inte. Jag körde precis följande kod:

ini_set('register_globals','0');

session_start();
$_SESSION['foo'] = '123';

echo $_SESSION['foo'].'<br/>';
$foo = '789';
echo $_SESSION['foo'].'<br/>';

Resultatet blev följande:

123
789

Vad händer om du sätter variabeln i URLen istället? Samma resultat? Menar, om du sätter variabeln i scriptet är det ju en sak, sätter du den utifrån är det en annan ;).

Gislaved.netMedlem sedan juni 20001 521 inlägg
#9

aleborg skrev:

Det är avstängt nu!
Det är dålig programmering att behöva ha register_globals=on
Det är avstängt på prov nu, klagar för många så får vi sätta på det igen!

Det kunde ju vara trevligt att få reda på sådana ändringar i förväg, så att man slipper panikändra alla sina PHP-filer. x(

MatteMedlem sedan aug. 20002 975 inlägg
#10

Då har man några gamla skript att gå igenom till helgen :)

CactuzMedlem sedan okt. 2001670 inlägg
#11

register_globals kan ju innebära en säkerhetsrisk då man kan skicka variablar till scriptet som annars aldrig skulle kunna "ändras". Dessutom är det mycket finare kod utan ;)

Gislaved.netMedlem sedan juni 20001 521 inlägg
#12

Matte skrev:

Då har man några gamla skript att gå igenom till helgen :)

Det trillar in ett mail varannan minut som frågar varför mina sidor inte fungerar, så det blir väl att programmera om cirka 150 scripts inatt. Jag som hade tänkt att titta på TV.

Cactuz skrev:

register_globals kan ju innebära en säkerhetsrisk då man kan skicka variablar till scriptet som annars aldrig skulle kunna "ändras". Dessutom är det mycket finare kod utan

Inte om man räknar med sådant när man kodar.

CactuzMedlem sedan okt. 2001670 inlägg
#13

Inte om man räknar med sådant när man kodar.

Men om man nu tänker när man kodar kan man ju skriva det för register_globals = off så fungerar det ju i båda :p

Gislaved.netMedlem sedan juni 20001 521 inlägg
#14

Cactuz skrev:

Inte om man räknar med sådant när man kodar.

Men om man nu tänker när man kodar kan man ju skriva det för register_globals = off så fungerar det ju i båda :p

Jovisst. Det hade absolut inte varit några problem om register_globals varit avslaget från början. Men att plötsligt stänga av det utan någon förvarning och därmed göra så att många sidor inte fungerar är oförsvarligt.

aleborgMedlem sedan jan. 20013 341 inlägg
#15

Det är på igen Gislaved.net!
Jag slog av det för jag hade för mig att den var av innan HD bytet!

Gislaved.netMedlem sedan juni 20001 521 inlägg
#16

Tack för snabbt agerande!

SkarreMedlem sedan apr. 20012 427 inlägg
#17

aleborg skrev:

Det är på igen Gislaved.net!
Jag slog av det för jag hade för mig att den var av innan HD bytet!

För min del är det inga problem längre. Jag har ändrat variabelnamnen och kontrollerat att det inte förekommer några konflikter. Tråkigt dock att man ska behöva ha register_globals på. Men det är väl default-värdet i senare versioner av PHP så jag antar att folk förr eller senare tvingas lära sig programmera utan register_globals.

Nexus86Medlem sedan okt. 20023 030 inlägg
#18

Litegrann om säkerhetsproblem man kan stöta på vid felprogrammering med register_globals: http://se.php.net/manual/en/security.registerglobals.php

Gislaved.netMedlem sedan juni 20001 521 inlägg
#19

Enligt deras exempel:

<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1 
// So, anyone can be seen as authenticated!
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>

Skulle det inte räcka med att sätta ett värde på $authorized först?

<?php
$authorized = 0;
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = 1;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1 
// So, anyone can be seen as authenticated!
if ($authorized == 1) {
    include "/highly/sensitive/data.php";
}
?>

Jag tror att många som kodar tror att de är skyddade bara för att register_globals är avslaget, och bryr sig sedan inte om att granska sina variabler.

Nexus86Medlem sedan okt. 20023 030 inlägg
#20

Jo. Det räcker faktiskt. Men det är tyvärr inte alla som tänker på den biten. :l

Sedan är det ju inte heller så stora problem med att skriva om ett script från register_global på till av. Ett exempel för att få det att fungera för båda har t.ex. jag här på forumet.

136 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)