Ehmm..
Kan någon yttra sig åt mig om detta?
"script är "säkrare" om man alltid använder sig av de globala variablerna"
Utlåtande tack!
:D
12 svar · 491 visningar · startad av Fredde Mannen
Ehmm..
Kan någon yttra sig åt mig om detta?
"script är "säkrare" om man alltid använder sig av de globala variablerna"
Utlåtande tack!
:D
De jag menar var att jag skrev ett script för en inlämningsuppgift!
Fick den godkänd men med kommentarer om att
Sedan så förstår jag inte varför du "plockar ut" värdena ur $_POST. Skriptet blir mer lättläst och "säkrare" om man alltid använder sig av de globala variablerna."
Men då började jag fundera nu, globala variablar, handlar inte de om man vill ha variablar i funktioner globala eller icke globala, dvs lokala!
Alltså:
<?
function plus() {
global $tal1, $tal2;
$svar = $tal1 + $tal2;
return $svar;
}
$tal1 = 12;
$tal2 = 11;
$svar = plus();
echo $svar;
?>
Så vad syftar han på? ehum..
ang. $_POST, så är det väl lämpligast att hämta värdet med $_POST, och inte med formulärnamnet, ex $namn ?
:q
http://se.php.net/manual/en/language.variables.predefined.php
Sedan så förstår jag inte varför du "plockar ut" värdena ur $_POST. Skriptet blir mer lättläst och "säkrare" om man alltid använder sig av de globala variablerna.
Misstänker att du gör något sådant här
$id = $_POST['id'];
Det är väl det han ifrågasätter. Varför lagra om värdet i $id när du redan har värdet i $_POST['id']
misstänkte det! :)
det är väl i sig inget större fel att göra så eller? Ser många som gör så, sen är man lite fast i ASP, sen början! :)
Det är ju inget syntaxfel men det är rätt onödigt och tar upp dubbelt så mycket plats.
Jag lägger nästan alltid $_POST-värden i nya variabler. När en besökare skickar ett formulär och jag måste visa ett felmeddelande för att denne glömt fylla i ett fält, då vill jag inte tvinga dem att fylla i hela formuläret från början igen. Därför ser det ofta ut ungefär såhär i toppen av mina formulärsidor.
if ($_POST) {
$name = $_POST['name'];
$email = $_POST['email'];
} else {
$name = '';
$email = '';
}
Formuläret kan då se ut ungefär så här.
<form>
<input type="text" name="name" value="<?=$name?>" />
<input type="text" name="email" value="<?=$email?>" />
</form>
Men om ni nu tycker att det är onödigt, hur gör ni då för att bevara värdena i ett formulär på här sättet? Man kan ju inte gärna skriva så här
<input type="text" name="name" value="<?=$_POST['name']?>" />
Har jag missat något?
Alpha II skrev:
Det är ju inget syntaxfel men det är rätt onödigt och tar upp dubbelt så mycket plats.
Mjo, men att det tar upp mer plats, struntar jag i!
Saken var den, blir scriptet "säkrare" genom att inte göra så här:
$var = $_POST['formvar'];
till skillnad från
$_POST['formvar'];
:q
att de kräver mer plats i minnet är en sak! Men blir de säkrare?
Om nu register_globals = OFF
Jag tror att en tanke kan vara följande:
De värden som ligger i $_POST är tveklöst från det postade formuläret. Om du slentrianmässigt sätter du om alla POST, GET, SESSION och COOKIES till samma namn utanför de respektive arrayerna i dina skript, kan en krock uppstå. Om du gör detta i olika skript (via include) eller om skriptet är långt, kan då otrevliga saker hända.
Ett snabbt, förenklat och knasigt exempel som dock illustrerar vad jag menar är följande:
Antag att alla sidor kollar inloggning genom en inkluderad fil som gör följande:
$inne = $_SESSION["inne"]; //Får värdet 0 för icke inloggad tex.
Senare i skriptet:
$inne = $_POST["inne"]; //Får värdet 7 tex.
Senare igen:
if ($inne) {
print $lösenord;
}
Ingen höjdare direkt!!
Om du däremot skrev:
if (isSet($_SESSION["inne"]) && $_SESSION["inne"] == 1) {
print $lösenord;
}
så kan inget otrevligt hända.
-----
En annan skillnad är att POST, GET, SESSION och COOKIES är superglobala och syns även i funktioner, medan globala variabler som du definierar inte syns i funktioner med default.
$inne = $_SESSION["inne"];
//returnerar alltid 0
function sloppy() {
return $inne;
}
//Funkar
function works() {
global $inne;
return $inne;
}
//Funkar
function in() {
return $_SESSION["inne"];
}
hmm, jag tycker också att det blir snyggare kod om man slänger in post-variabler i nya variabler som man sedan kan använda i sina sql-frågor osv. Blir mycket mer lättläst. Att det skulle kräva märkbart mer laddningstid tror jag inte på.
för att förhindra slumpkrockar så kan man ju sätta $p_namn för postvariabel, $g_namn för get, $c_namn för cookie och $s_namn för session osv.
$p_namn eller kanske $pNamn är mer lättläst än $_POST['namn'] och dessutom färre tecken man behöver skriva (fnuttarna och klamrarna behöver ju öven dubbelgrepp för att knappas in :P ). Vill man sedan lägga på en funktion på $_POST['namn'] så behöver man bara ändra det första gången.
Jag tycker att det verkar mycket vettigt. Har jag missat nåt?
Jag kan av egen erfarenhet säga att det blir mycket lättare när man kommer tillbaka till gamla skript efter ett halvår eller så, att följa skriptet och förstå om man använt $_POST['variabel'] och liknande i sin kod istället för omskrivna variabler.
Därför inte sagt att det inte finns tillfällen då det kan vara lämpligt att lägga över i andra variabler.
Låter vackert!
Men åter igen detta med:
$var = $_POST['formvar'];
Hittade nyligen i boken PHP 3 och PHP 5 av Jesper EK m.fl. där han sätter
$var = $_POST['formvar'];
Om det nu är säkrare att bara använda sig av den superglobala variabeln, varför går han ut med ett sådant ex. :q
ex. http://nezzo.nu/na.asp?id1=96&id2=3148
(borde väl tänka säkert, tycker man juh! )
är som lite konfundersam! *s*
Ett skäl till att läroböcker skriver så KAN vara att det gör skripten lättare att anpassa för folk som sitter med äldre versioner av PHP. Då är det bara tilldelningsdelen som ska ändras, medan annars är det problem i hela skriptet. Min bok har någon småknasighet (kommer inte ihåg vad) där de speciellt säger att de gör på ett sämre sätt med tanke på folk med äldre PHP-versioner.
aasah skrev:
Ett skäl till att läroböcker skriver så KAN vara att det gör skripten lättare att anpassa för folk som sitter med äldre versioner av PHP. Då är det bara tilldelningsdelen som ska ändras, medan annars är det problem i hela skriptet. Min bok har någon småknasighet (kommer inte ihåg vad) där de speciellt säger att de gör på ett sämre sätt med tanke på folk med äldre PHP-versioner.
Gudarsskymning.
Är boken för PHP 5, så räknar jag med att folk använder PHP 5 :OO