webForumDet fria alternativet

Det här med globala variabler

PHPur PHP

4 svar · 515 visningar · startad av Kosse

Medlem sedan juni 2000162 inlägg
Frågan#1

Jag har alltid använt globala variabler i länkar osv. Och det gör jag även nu. Men så dyker ju säkerhetsfrågan upp. Det är ju lätt att manipulera med variabler i länkar och på så sätt sabotera en sajts funktionellitet. Även om detta med smart programmering går att undvika. I nya versionerna av PHP är ju globala variabler avstängda som standard och något nytt med POST & GET är infört. Jaha, kan någon förklara för mig hur jag ska ändra i hela min sajt så jag kan använda POST & GET Grejjen?

Och är det inte möjligt att manipulera dessa?

<a href=\"index.php?ID=ensida&test=$test\">Länk</a>

Liknande länkar som den ovan är min sajt full av. Hur för jag in nya POST GET grejen överallt?

Och säg att jag byter till GET/POST hanteringen men webbhotellet fortfarande har globala variabler på. Hur undviker jag då att någon utnyttjar dessa för att manipulera med min sida?

Medlem sedan okt. 2001538 inlägg
#2

Jag är inte bra åp att beskriva, så förstår du inte, så beror det nog snarare på at jag är kass, än att du är det ;) men i korthet:

När man lägger till värden i länkar på sättet som du gjort, så hamnar de i arrayen $_GET

Klickar man på din länk som du gav som exempel så kunde du (antar jag) förut hämta ut värdet "ensida" ur $ID variabeln, korrekt?

Nu skulle du då behöva hämta den från $_GET['ID']
Likadant skulle $_GET['test'] innehålla värdet som låg i variabeln $test som du skrev till länken.

Använder du formulär så skall det ju finnas en metod för hur datan skickas

<form name="ettNamn" action="enSida.php" method="post">

alternativt

<form name="ettNamn" action="enSida.php" method="get">

har du ett input fält med namnet text kommer nu värdet som stoppades in i detta fält att kunna hämtas i $_POST['text'] resp. $_GET['text'] beroende på vilken metod du angav i form-taggen.

Den säkerhetsrisk som föreligger är ju om man har en sida som förväntar sig data från ett formulär skickat med metoden post, globala variabler är på, och någon plitar in samma varaibel namn med egna värden bakom adressen till den sidan.

Så hur som haver så är det enda säkra sättet att på mottagarsidan, i det anropade scriptet, som tar emot värdena, att kolla att de värden verkligen kan stämma. (Typ att värdena inte innehåller några elaka tecken som kan bråka med scriptet eller servern eller att det är av förväntad datatyp etc.)

Men iaf. för att svara på din ursprungsfråga, hur du får det att funka, på alla ställen där du tidigare hämtade värden ur variabler som har samma namn som i adressen

<a href=\"index.php?[b]ID[/b]=ensida&[b]test[/b]=$test\">Länk</a>

blir ju

$ID och $test i detta fallet, skall ersättas med $_GET['ID'] och $_GET['test']

Och vad gäller säkerhet, för att inte manipulera querystringen, kontrollera som sagt värdena, att de kan stämma efter att du tagit emot dem.

Hoppas det var till nytta
MVH Patrik

/r: kodfel
/r2: pinsamt stavfel

Medlem sedan mars 20034 471 inlägg
#3

Det Patrik81 skriver är riktigt men jag har ett tillägg.

Om du använder metoden GET får du länkar till sidorna på precis samma sätt som du har nu. Det innebär att man kan "hoppa över" formulärsidan helt och hållet. Genom att titta efter i Källa på vilken fil som laddas av formen, så kan man själv skriva sökvägen och fylla i helt egna värden i länken. Därför måste en ev koll av att fälten innehåller vettiga saker ligga i den mottagande sidan och inte i formulärsidan.

Om du däremot använder POST kommer inte värdena från posten att synas i länken. I och med detta kan man inte:
* Direktlänka till den omhändertagande sidan direkt med värden ifyllda.
* Hoppa över att använda formuläret eftersom det krävs för att värdena ska skickas.
Däremot måste man fortfarande kolla att man fick in något vettigt, eftersom knasiga saker lika bra kan komma via formuläret.

Exempel:
<form name="ettNamn" action="enSida.php" method="post">
<input type="text" name="field1">
<input type="submit" name = "submit" value="S">

ger länken: enSida.php och värdet hämtas med $_POST["field1"]

medan
<form name="ettNamn" action="enSida.php" method="get">
<input type="text" name="field1">
<input type="submit" name = "submit" value="S">

ger länken: enSida.php?field1=test och värdet hämtas med $_GET["field1"] (om du fyller i test).

Medlem sedan okt. 20001 285 inlägg
#4

Kolla om get innehåller trollformler §jr

foreach ($_GET as $crap) {
    if (!ereg("^[a-zA-Z0-9_åäöÅÄÖ]+$", $crap)) {
    	echo "Jag vet var du bor..";
        exit;
	}
}

kolla om ID är satt / finns ( om det är en sida )

if (!isset($_GET['ID'])){
	$_GET['ID'] = "index";
}
if (file_exists($_GET['ID'])) {
	include $_GET['ID'];
.....
Medlem sedan juni 2000162 inlägg
#5

Tackar för era svar, ska ta mig en ordentlig funderare och försöka sätta mig in i den här nya variabelhanteringen. =)

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