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?
register_globals = on
19 svar · 453 visningar · startad av Skarre
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'].
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. :)
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.
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
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.
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!
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 ;).
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(
Då har man några gamla skript att gå igenom till helgen :)
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 ;)
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.
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
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.
Det är på igen Gislaved.net!
Jag slog av det för jag hade för mig att den var av innan HD bytet!
Tack för snabbt agerande!
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.
Litegrann om säkerhetsproblem man kan stöta på vid felprogrammering med register_globals: http://se.php.net/manual/en/security.registerglobals.php
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.
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.