Egy oszlopos cimborám szerint, a PHP nyelv úgy készült, hogy a developerek fogták pár programozási nyelvnek a kézikönyvét, bepanírozták, kirántották, megcsócsálták, leöblítették fél liter hashajtóval, és az így születő végterméket bedobozolták. Az eddigi gyöngyszemek mellett felbukkant egy újabb, amire józan, paraszti ésszel kevés magyarázatot lehet találni.
Ismerős hív, hogy van neki egy veretes php3-as kódja, amit rálőcsöltek, mert űbergyorsan PHP5 alatt futtathatóvá kell tenni és valami gáz van vele. A probléma, hogy az eredeti kódnak az oldalak szép hosszú stringeket adnak át paraméterekként és ez nem megyen. Ő első lépésként az összes $HTTP_GET_VARS-t lecserélte $_GET-re, lévén az előbbi deprecated és a célzott szerver nem engedi az ilyen változók használatát.
Elkezdte tesztelni az oldalt és 90%-ban működött, de amint hosszú string kerül paraméterként átadásra akkor mindenféle, nem várt működést eredményezett. Értsd, semmi hibaüzenet, csak, mintha az átadott string egyes darabjai eltűntek volna.
Átküldi a kódot, ami nagyjából az én "hello world" szintemen áll. Gyakorlatilag pár form, statikusan beépített link és egy parser, ami $_GET-től kapott stringet pofozza át a mysql lekérdezésbe. A kód viszonylag szépen van megírva, aki csinálta, figyelt, hogy megfelelően kezelje a bejövő értékeket. Próbaképp megetetem a php kódot a GET metódussal küldöttekkel simán változóként beadova és nézem az eredményt, ami megfelel a vártnak. Ugyanezt GET metódussal átküldve teljesen mást ad vissza. Úgy tűnik a parser nem azt kapja amit vár.
Nézem a PHP doksit ami a következőket írja:
"$HTTP_GET_VARS contains the same initial information, but is not a superglobal. (Note that $HTTP_GET_VARS and $_GET are different variables and that PHP handles them as such)"
Ránézésre tehát a $_GET = $HTTP_GET_VARS, teháta cserének nem kellett volna a működést befolyásolnia. Aztán kcisit lejjebb görgetek és észreveszem ezt a mgjegyzést:
"The GET variables are passed through urldecode()."
Megnézem az urldecode() leírását:
"Decodes any %## encoding in the given string. Plus symbols ('+') are decoded to a space character."
Valószínűleg kitaláltátok, a böngésző által átküldött stringben a keresett kifejezések '+' jelekkel összefűzve és a parser a lekérdezés előállításakor ezt kereste. FUUUUUUUUU...
Értem, hogy a PHP Pistikék életét akarták megkönnyíteni a $_GET urldecode()-on való alapértelmezett átfűzésén. Értem én, hogy szükséges a speciális karakterek kezelése. De miért kellett hozzácsapni a '+' jelet? Miért csak a '+' jelet?
Ez bizony olyan szofisztikált tervezési titok, melyet a közhalandó bizony soha nem fog megérteni...