Register globals on / off

Tags:    php

Jeg kom til at tænke over, hvad forskellen er på register globals on og off?

Da jeg ikke anede det mindste om PHP endnu, downloadede jeg et script, hvor der stod, at man skulle sætte det til on, for at få det til at virke, så den indstilling har jeg sådan set bare haft siden...

Men nu stødte jeg ind i et sted, hvor der stod, at alle kodeeksempler/scripts man gav andre, skulle kunne bruges med registerglobals til off...

Og så kom spørgsmålet frem igen...
Jeg mindes også at kunne huske at det har noget med sikkerhed at gøre?

Jeg prøvede at slå det op i manualen, men det virkede simpelt hen så indviklet... - jeg kunne slet ikke finde hovede og hale i det...

Jeg ved godt, at det er meget forkert at have problemer med at slå ting op i manualen, men hvis jeg ikke spørger et sted hvor folk kan formulere sig sådan, så selv folk som mig, som ikke er sat så grundigt ind i "professor"-sproget kan forstå det, så plejer det at ende med at jeg bare ikke får noget svar, og så tænker "skidt pyt... - jeg bruger bare de ting jeg allerede kan finde ud af, og virkede det i går, så virker det nok også i dag, og i morgen med"

Men nu hvor jeg synes at jeg kan huske, at det har noget med sikkerhed at gøre, + at det åbenbart ser ud til at være meget vigtigt, at de ting jeg laver kan bruges uden at indstillingerne er sat til on, så vil jeg altså bare finde ud af det denne gang :)

Jeg håber meget at der er nogle der kan svare :)
Jeg vil være meget taknemmelig, hvis der er nogle der vil tage sig tid til at forklare helt ned i de små detaljer ;)



7 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
Register globals er noget, der har været i PHP siden begyndelsen, hvor man troede det var en smart ting. Man har siden fundet ud af, at det er et sikkerhedsproblem, men da meget gammel kode er afhængig af funktionen, findes den stadig.

Det anbefales at slå det fra, og rette koden, så den ikke er afhængig af at indstillingen er slået til.

Hvad der sker, når indstillingen er slået til, er: Alle input, som kommer fra brugeren, laves om til variable (disse variable er globale, hvorfra navnet stammer). Sikkerhedproblemet er, at brugeren harved har mulighed for at ændre dine variable, hvis du et eller andet skulle glemme at initiere den korrekt.

Register globals er altså ingen sikkerhedsrisiko, hvis din kode er fejlfri, men hvem er fejlfri?

Det bedste eksempel er nok første eksempel fra denne side:
http://dk.php.net/register_globals



I PHP6 bliver register_globals endegyldigt fjernet, for at sætte en ende på sikkerhedsproblemet som Jesper påpeger.



Okay, for jer kloge mennesker, der har forstand på det hér, lyder jeg sikkert meget dum når jeg siger det hér, men jeg kan altså ikke lade være med at spørge, til jeg har fået det hér på plads...

Altså, med input der kommer fra brugeren, mener i så det vi hiver ud af en html-form?
F.eks.
$_POST[inputfelt]; / request / post?

Og hvad vil de sige, at de laves om til "globale varible"?
Er post/request/get ikke allerede globale?
Og hvordan for man data ud, hvis man ikke kan bruge de funktioner?

Og hvad vil det sige at "initiere mine variable"?

Og hvordan kan brugeren ændre dem?

Og eksemplet i manualen forvirre mig kun...
Hvad menes der med "if (authenticated_user())"?
Tjekker den en hjemmelavet funktion?
Og hvordan bliver det bedre af, at vi først siger
$authorized = false; ?

På en hvis måde, har jeg jo fået lavet mange gode ting med PHP, men på den anden side, så er jeg altså stadig newbie ;)

Og jeg lyder sansynligvis stjerne-, mega- dum når jeg spørger, men hvis jeg ikke spørger, finder jeg i hvert fald aldrig ud af det...

Håber I gider svare på den sidste omgang spørgsmål også :)



I eksemplet fra manualen:

authenticated_user() er en hjemmelavet funktion, som kontrollerer om brugeren har adgang.

Hvis register_globals er off: vil følgende variabler blive oprettet, når man kalder siden mypage.php?authorized=true

$_GET['authorized'] = 'true';

Hvis register_globals derimod var on, ville følgende variabler blive oprettet

$_GET['authorized'] = 'true';
$authorized = 'true';

I eksemplet fra manualen, vil variablen $authorized beholde dens initielle værdi, hvis brugeren ikke blev godkendt. Og hvis register_globals er on, kan brugeren bestemme den initielle værdi ved at skrive den i adressen.



Jeg er dum som en dør... Jeg er desværre stadig forvirret :$

Altså, register globals on gør, at man kan finde en querystring på to måder... Både ved at sige $_GET['authorized'] og ved bare at sige $authorized ??

Og ved off kan man kun bruge get?
Og så kan man ikke sno sig uden om dette hér:

if (adgangerkorrekt()) {
$adgang = true;
}

For hvis registerglobals var sat til on, så ville $adgang være lig med true, hvis man skrev check.php?adgang=1, men når det er sat til off, er det kun $_GET['adgang'], der kan være lig med true, hvis man skriver det?

Men hvis man nu skrev enten:
if (adgangerkorrekt()) {
$adgang = true;
}
else {
$adgang = false;
}

eller skrev (som de gør i manualen):

$adgang = false;
if (adgangerkorrekt()) {
$adgang = true;
}
Ville man så ikke have klaret problemet, mens register globals er sat til on?

Og er det virkelig det hele?
Er den eneste hrund til at register globals skulle være sat til on så ikke, at det er nemmest i dette eksempel at sige:

if ($side == "omsiden") {
include("siden.php");
}
elseif ($side == "jokes") {
include("jokes.php");
}

i stedet for at tilføje $side = $_GET[side]; for oven?
Og er det ikke meget simpelt?
Jeg tænker bare, at en så vigtig ting må være mere kompliceret end det...

Og hvad betyder den "initielle værdi"?
Er det bare variablens værdi?
Og er at "initiere en variabel" bare det samme som at lave den?

Jeg har på fornemmelsen at jeg (dum som jeg virkelig er og føler mig), har misfortået et eller andet fuldstændig...

I bliver nødt til at snakke til mig, som om i snakker til en en total idiot :P For jeg er altså virkelig ikke super dygtig til det hér emne...
Vil bare gerne sikre mig at mine ting virker ;)
Og at der ikke er nogle sikkerhedsproblemer...



Indlæg senest redigeret d. 09.03.2007 15:09 af Bruger #11381
register_globals gør at PHP selv registrere indholdet af alle superglobals, og laver globale variabel versioner som har samme navn som indholdet af variablen.

Altså:
$_GET['envar'] = $envar
$_POST['envar'] = $envar
$_COOKIE['envar'] = $envar
$_SESSION['envar'] = $envar

Og dette er hele problemet med register_globals. Som du kan se, så kommer $envar fra vidt forskellige steder, MEN den har samme navn, og du kan IKKE vide hvorfra den kom. MEGET stor sikkerhedsbrist. Hvis du vil have $_GET. $_POST og $_COOKIE samlet i én, kan du bruge $_REQUEST.

Du kan læse om superglobals her: http://dk2.php.net/manual/en/language.variables.predefined.php


og register_globals her: http://dk2.php.net/register_globals



Indlæg senest redigeret d. 09.03.2007 15:21 af Bruger #2330
Jahu!
Endelig fandt jeg ud af det ;)

Tusind, tusind tak til jer alle sammen!

Det bliver nok ikke noget stort problem at ændre det til off igen, da jeg ikke selv vidste at man kunne forkorte dem på den måde... Og nu er jeg gået over til mine egne scripts ;)


Igen, tusind tusind tak!

Pointene er blevet uddelt...
Jeg kunne jo ikke give nogle point til dig, Nørden, så de er alle sammen givet til Jesper ;)

Men I skal alle sammen have et stort tak fra mig af! :)
Så er jeg blevet det klogere ;)




t