Avatar billede alvion Nybegynder
26. august 2005 - 01:34 Der er 13 kommentarer og
1 løsning

Oplæg til diskussion: $_REQUEST vs. $_GET, $_POST, $COOKIE

Jeg har nu læst adskillige artikler (offline/online, bla. i php|Architect) omhandlende input-filtrering.

Alle som én har de et eller andet sted et afsnit om, at man IKKE bør bruge $_REQUEST, men istedet de separate $_GET, $_POST og $_COOKIE ($_REQUEST samler netop disse tre). Der er dog ingen af artiklerne, der giver en særlig god begrundelse andet en den, at man som udvikler ikke kan se, hvorfra et givent datasæt kommer fra.

Men det synes jeg er en tynd begrundelse. Regel nr. 1 i input-filtrering er, at man ikke kan stole på NOGEN data. Alle data (om de kommer fra GET (querystring), POST (form) eller COOKIE kan jo forfalskes af en bare nogenlunde habil programmør. Når dette nu er tilfældet, kan vi i princippet så ikke blot være ligeglade med, fra hvilken af disse tre datakilder vores data kommer?

Gør det i virkeligheden ikke blot vores PHP-script mere fleksibelt, at anvende $_REQUEST?

Jeg forudsætter selvfølgelig input-filtrering (som white-listing, range-checking, mv.) er implementeret.

Jeg stiller hermed op til en saglig og forhåbentlig oplysende debat.
Avatar billede Slettet bruger
26. august 2005 - 07:57 #1
Jeg tror det er nemmere at lære folk at slå register_globals fra end det er at lære dem at filtrere input.

At det ene ikke forhindrer det andet må vi så lære dem senere :)
Avatar billede nielle Nybegynder
26. august 2005 - 08:20 #2
Jeg synes nu at det er en udemærket begrundelse - ikke så meget pga. validering, men simpelthen fordi at det gør koden mere læsevenlig, og mere præcis. Når man ser en $_POST så ved man at den kommer fra en form med method="form", og når man ser en $_COOKIE så ved man hvor den kommer fra - ja – fra en cookie. Dermed er man i øvrigt også bedre i stand til at se hvordan man sætter en cookie, og indse hvorfor man ikke ikke kan gøre det sammen med en $_POST.

Bare fordi at der findes en funktion som ”fanger alt”, så er min mening at man alligevel bør vælge en kode som rammer så præcist som muligt.

En lignenede problemstilling var i øvrigt oppe i:

http://www.eksperten.dk/spm/643073

- hvor der blev spurgt om hvilken af de to muligheder:

if (mysql_num_rows($query) == 0) { ...
if (!mysql_num_rows($query)) { ...

- man burde vælge.

De virker begge to, men nu giver mysql_num_rows($query) jo altså en talværdi tilbage og ikke en boolsk. Grunden til at nr. 2 virker at PHP har en lille genvej som hedder 0=false (det er der andre programmeringssprog som også gør, f.eks. C).

Min holdning er at man absolut bør vælge den første idet denne mere præcis udtrykker det der er ment. Det samme argument går for $_REQUEST. At begynde at bruge alle PHP's genveje i stedet for at udtrykke tingene så præcist som muligt er i min bog det samme som at være for doven og et tegne på manglende professionalisme.
Avatar billede erikjacobsen Ekspert
26. august 2005 - 08:58 #3
Der er ingen sikkerhedsmæssig begrundelse for ikke at bruge $_REQUEST. Man ser sommetider argumenter som at med $_REQUEST kan en bruger sætte noget i URL-en som rettelig burde være i en <form>. Men en hacker kan selvfølgelig gøre hvad som helst med $_POST og $_COOKIE alligevel.

Så det er mere en bekvemmelighedsmæssig begrundelse - det er nemmere at læse, og man kan skelne mellem eens navne i $_POST, $_GET og $_COOKIE. Du vil give mig ret i det sidste den dag du ved et uheld laver en <form> med et felt, der har samme navn som noget du har lagt i en cookie.

Ønsker du derimod en fleksibilitet, som at man skal kunne logge ind med et almindeligt link  ....php?user=mig&pass=dig  og gøre det samme med en <form>, så kan $_REQUEST vel overvejes.
Avatar billede alvion Nybegynder
26. august 2005 - 10:14 #4
Jeg forstår godt argumentationen i forhold til $_COOKIE. I virkeligheden ville jeg jo nok også mene, at $_REQUEST ville ha' været stærkere, hvis $_COOKIES ikke var inkluderet.

For netop $_GET og $_POST mener jeg bør smelte sammen. Jeg vil aldrig lave en applikation, som bruger det samme parameternavn i querystring og form på samme tid. Men somme tider er det mere praktisk at placere i en formular, hvad der normalt "burde" være en querystring-parameter. Og så mener jeg at det er en svaghed, hvis mit program ikke kan håndtere at parameteren kan komme begge steder fra.

Med det in mente er det IMHO meget besværligt at skulle skrive:

$minvar = isset($_GET["minvar"]) ? $_GET["minvar"] : $_POST["minvar"];

eller lignende.

Tanken er bla. kommet til mig, fordi jeg prøver at få PHPList til at virke på IIS. Koden i PHPList roder bogstaveligt rundt i _GET og _POST...
Avatar billede erikjacobsen Ekspert
26. august 2005 - 10:22 #5
Du kan med en lille metode på få linier lave din egen sammensmeltning af $_POST og $_GET. Kald den fx: $_PG
Avatar billede alvion Nybegynder
26. august 2005 - 10:36 #6
Ja det sad jeg også og tænkte på. Så er der bare en lille hage: Det er ikke en "superglobal".
Avatar billede alvion Nybegynder
26. august 2005 - 10:37 #7
Jeg kunne selvfølgelig lave en "Singleton" der håndterede dette - eller en klasse med statiske metoder.
Avatar billede erikjacobsen Ekspert
26. august 2005 - 10:52 #8
Så kan du jo genbruge $_POST eller $_GET, hvis den skal være superglobal.
Avatar billede alvion Nybegynder
26. august 2005 - 10:54 #9
Puha den var grim Erik... Fy føj! :-)
Avatar billede erikjacobsen Ekspert
26. august 2005 - 10:56 #10
Jah, men ikke grimmere en $_REQUEST. Skitse:

<?
  function makePOST() {
    foreach ($_GET as $k=>$v) {
      $_POST[$k]=$v;
    }
  }

  makePOST();

  foreach ($_POST as $k=>$v) {
    print "\$_POST[$k]={$v}<br>";
  }

?>

<form action="index.php?hej=med" method="post">
<input type="text" name="dig" value="peter">
<input type="submit">
</form>
Avatar billede erikjacobsen Ekspert
26. august 2005 - 10:56 #11
Mente: Jah, men ikke grimmere end en $_REQUEST.
Avatar billede erikjacobsen Ekspert
26. august 2005 - 10:57 #12
Og det skal nok være den vej, fra $_GET til $_POST, da $_POST kan indeholde større værdier, der vil være mere tidskrævende at kopiere.
Avatar billede alvion Nybegynder
26. august 2005 - 11:01 #13
Ja men du har jo - som altid - ret... :-)

Mht. performance er det også bedre end min Singleton, idet sidstnævnte introducerer et funktionskald, hver gang jeg skal bruge en variabel.
Avatar billede alvion Nybegynder
18. august 2010 - 12:00 #14
Hold da op, det var en tur ned af "memory-lane" :-)

Hermed lukket
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester