mboost-dp1

php

Fejl i PHP kan få servere til at crashe

- Via NetworkWorld - , redigeret af Emil

Der er for nyligt blevet fundet en fejl i PHP, som kan få hele webserveren til at crashe. Fejlen består i, at PHP ikke kan konvertere store decimaltal ordentligt og dermed starter en uendelig løkke.

Tallet 2,2250738585072011e-308 bruges som eksempel på en tekststreng, der, når den forsøges konverteret til et decimaltal, vil starte en sådan løkke. Personer med onde hensigter har dermed mulighed for at nedlægge PHP-servere ved at indsætte dette tal i PHP’s GET-funktion.

Fejlen ser kun ud til at berøre PHP version 5.2 og 5.3 på 32-bit x86 Intel-servere hvor det berører x87-instruktionssættet. Hvis man er i denne målgruppe, er der mulighed for at hente en patch, som skulle reparere fejlen.





Gå til bund
Gravatar #1 - f-style
5. jan. 2011 18:35
der skulle vidst stå x86, har indsent rettelse :-).
Gravatar #2 - arne_v
5. jan. 2011 18:37
#1

Jep - det er ved at være mange år siden at man talt eom x87 coprocessorer.
Gravatar #3 - HNicolai
5. jan. 2011 18:39
Øhh "32-bit x87", hvad med bare x86 ;)

Og det er da heller ikke alle store decimaltal, men lige netop kun et par store decimaltal.

Edit: lidt for langsom ang 32bit delen.
men her kommer lidt mere "guf":

What’s Special About 2.2250738585072011e-308?
2.2250738585072011e-308 represents the largest subnormal double-precision floating-point number; written as a hexadecimal floating-point constant, it’s 0x0.fffffffffffffp-1022. 2.2250738585072011e-308 is one of five 17-digit decimal values that convert (correctly) to 0x0.fffffffffffffp-1022:

* 2.2250738585072007e-308
* 2.2250738585072008e-308
* 2.2250738585072009e-308
* 2.2250738585072010e-308
* 2.2250738585072011e-308

Only 2.2250738585072011e-308 causes the problem. It happens to be the largest of the five decimal values, so I guess that matters somehow.
Kilde: http://www.exploringbinary.com/php-hangs-on-numeri...
Gravatar #4 - Emil
5. jan. 2011 18:43
#1-3 > Jeg har nu søgt en række kilder igennem, og de angiver alle, at der skulle være tale om x87.
Gravatar #5 - arne_v
5. jan. 2011 18:44

Personer med onde hensigter har dermed mulighed for at nedlægge PHP-servere ved at indsætte dette tal i PHP's GET-funktion.


Hvor står det henne?

Indtil PHP koden gør noget, så betragtes værdier i query streng vel som strenge.

Der er en kommentar i kilden:


This is *really* serious. In fact, I’ve just tested if the problem happens for GET passed values and it does. Not all the passed data to a website is treated as a number, so not all websites with the PHP versions and configuration that could fail with this bug will be vulnerable, but definitely there is going to be a huge amount of websites that will do. This is really scaring.

I hope the PHP team patch it soon.

Meanwhile, a possible workaround would be adding this line at the very top of the execution of php website:

if (strpos(str_replace(‘.’, ”, serialize($GLOBALS)), ’22250738585072011′)!==false) die();


Men jeg synes ikke at det er klart hvad de mener.

Gravatar #6 - arne_v
5. jan. 2011 18:46
Emil (4) skrev:
Jeg har nu søgt en række kilder igennem, og de angiver alle, at der skulle være tale om x87.


Nej.

Der står at det er x87 instruktions sættet.

I gamle dage var der en x87 coprocessor som understøttede det.

men siden 486 (ekskl. 486SX) har det instruktionsæt været en del af x86 processorer.
Gravatar #7 - LordMike
5. jan. 2011 19:38
Hvordan introducerer man sådan en bug ligepludselig.. ?

Det gælder jo kun fra 5.2 af... Så den må være relativt ny. :P
Gravatar #8 - p1x3l
5. jan. 2011 19:40
#7 evt fordi de har lavet noget optimering som har givet performence boost og så gav denne bug utilsigtet
Gravatar #9 - apkat
5. jan. 2011 19:43
Tallet 2,2250738585072011e-308 bruges som eksempel på en tekststreng, der, når den forsøges konverteret til et decimaltal, vil starte en sådan løkke.


Aaah, mit yndlingstal.
Gravatar #10 - mazing
5. jan. 2011 20:03
http://news.ycombinator.com/item?id=2066352 skrev:
Follow-up: PROBLEM SOLVED.

This problem occurs due to IA-32's 80-bit floating point arithmetic. The simple fix: add a "-ffloat-store" flag to your CFLAGS.

The problematic function, zend_strtod, seems to parse the mantissa (2.225...011 part) and the exponent (-308 part) separately, calculate the approximation of m*10^e and successively improve that approximation until the error becomes less than 0.5ulp. The problem is that this particular number causes the infinite loop (i.e. the iteration does not improve the error at all) in 80-bit FP, but does not in 64-bit FP. Since x86-64 in general uses the SSE2 instruction set (with 64-bit FP) instead of the deprecated x87 it does not have this problem.
Gravatar #11 - Laziter
5. jan. 2011 20:27
apkat (9) skrev:
Aaah, mit yndlingstal.


Damn.. Også dit?
Så er jeg jo nødt til at skifte password nu, det var nemlig lige tilfældigt det tal :D
Gravatar #12 - Kian
5. jan. 2011 20:59
Tjaaaah... jeg har seriøst, uden flamebait, aldrig forstået folk gider bruge PHP.
Og folk kalder det OOP... så længe det ikke er typestærkt er det i min optik ikke OOP og dermed forbliver OOP et scriptingsprog der skal kompilleres igen og igen og igen for hvert besøg.

Jeg faldt over http://maurus.net/resources/programming-languages/... - ganske morsom - fx med if/boolean-konstruktionerne. Ganske morsomt at

 if ("false" == 0) echo "true\n";// => true, wtf
Gravatar #13 - arne_v
5. jan. 2011 21:07
#12

Typestærk, OOP og kompileret er 3 helt uafhængige begreber efter gængse definitioner.

Gravatar #14 - arne_v
5. jan. 2011 21:13
#12

Med hensyn til eksemplet. Alle sprog har deres regler for sproget. Ovenstående virker ulogisk for folk med baggrund i andre sprog, men det er ikke usædvaneligt at folk som kender sprog X finder sprog Y mystisk.

C++:


cout << (false == 0) << endl;


ville måske også forundre nogen (der ikke kender C og C++).
Gravatar #15 - Arkimedes
5. jan. 2011 21:31
Kian (12) skrev:
Tjaaaah... jeg har seriøst, uden flamebait, aldrig forstået folk gider bruge PHP.
Og folk kalder det OOP... så længe det ikke er typestærkt er det i min optik ikke OOP og dermed forbliver OOP et scriptingsprog der skal kompilleres igen og igen og igen for hvert besøg.

...


Ja, arne_v siger det bedst selv, men du burde nu ansøge om at få dine skolepenge tilbage.

Alting er et eller andet sted objektorienteret. Ja, din MOR er objektorienteret. Og man kan jo ikke just kalde hendes transaktionssystem "letvægts".
Gravatar #16 - drbravo
5. jan. 2011 22:32
Arkimedes (15) skrev:
Kian (12) skrev:
Tjaaaah... jeg har seriøst, uden flamebait, aldrig forstået folk gider bruge PHP.
Og folk kalder det OOP... så længe det ikke er typestærkt er det i min optik ikke OOP og dermed forbliver OOP et scriptingsprog der skal kompilleres igen og igen og igen for hvert besøg.

...


Ja, arne_v siger det bedst selv, men du burde nu ansøge om at få dine skolepenge tilbage.

Alting er et eller andet sted objektorienteret. Ja, din MOR er objektorienteret. Og man kan jo ikke just kalde hendes transaktionssystem "letvægts".


Du har helt ret. Man skal aldrig diskutere med en filosof.
Gravatar #17 - Lobais
5. jan. 2011 22:57
Fejlen består i, at PHP ikke kan konvertere store decimaltal ordentligt ...
Tallet 2,2250738585072011e-308 bruges som eksempel

Øh, hvis det er et stort decimaltal, så tør jeg slet ikke tænke på kæmpetal som 0.001 eller måske endda 2...
Gravatar #18 - cryo
5. jan. 2011 23:07
arne_v (6) skrev:
Nej.

Der står at det er x87 instruktions sættet.

I gamle dage var der en x87 coprocessor som understøttede det.

men siden 486 (ekskl. 486SX) har det instruktionsæt været en del af x86 processorer.


Og? Det nærmer sig jo ordkløveri :-p. Fejlen opstår i visse tilfælde hvis man ikke optimerer til nyere CPUer, og får genereret iøvrigt forældede x87-instruktioner. Så det er da rimelig relevant at det er x87, om dens instruktioner så ellers er en del af CPUen eller ligger eksternt.
Gravatar #19 - arne_v
6. jan. 2011 00:03
#18

Jeg synes at "32-bit x87 Intel-servere" er noget misvisende. Det kunne give folk den opfattelse at de ikke havde et problem med en x86 server.

Gravatar #20 - arne_v
6. jan. 2011 00:04
#18

Og x87 instruktionerne er vel ikke forældede på 32 bit.
Gravatar #21 - webwarp
6. jan. 2011 08:01
Hvad med php4 ? Er den blot ikke nævnt fordi folk ikke tror vi bruger det længere eller er den ikke ramt ?
Gravatar #22 - .dot
6. jan. 2011 08:20
webwarp (21) skrev:
Hvad med php4 ? Er den blot ikke nævnt fordi folk ikke tror vi bruger det længere eller er den ikke ramt ?

php4 har været død og begravet i over 2,5 år
Gravatar #23 - Bllets
6. jan. 2011 08:58
.dot (22) skrev:
php4 burde har været død og begravet i over 2,5 år


Fixed
Gravatar #24 - cronick
6. jan. 2011 14:37
Kian (12) skrev:
Jeg faldt over http://maurus.net/resources/programming-languages/... - ganske morsom - fx med if/boolean-konstruktionerne. Ganske morsomt at

 if ("false" == 0) echo "true\n";// => true, wtf


Hvorfor er det specielt morsomt? Der bliver sammenlignet en streng med et tal, hvilket er en fejl fra udviklerens side. For at gøre bod på hans fejl, prøves der at få mening ud af sætningen ved at omforme strengen til et tal, hvorved "false" som værende boolean naturligt giver 0 som tal.

Gravatar #25 - arne_v
6. jan. 2011 15:04
#24

Det er dybt mystisk for en Fortran/Pascal/C/C++/Java/C# udvikler.

Men for en PHP udvikler er det naturligt. Maaske vil en VB udvikler ogsaa finde det mindre overraskende.

Mne forskellige sprog har forskellige filosofier.
Gravatar #26 - arne_v
6. jan. 2011 15:04
Bllets (23) skrev:
Fixed


Substans men ikke dansk!

:-)
Gravatar #27 - reefermadness  
6. jan. 2011 15:38
Kian (12) skrev:
Tjaaaah... jeg har seriøst, uden flamebait, aldrig forstået folk gider bruge PHP.
Og folk kalder det OOP... så længe det ikke er typestærkt er det i min optik ikke OOP og dermed forbliver OOP et scriptingsprog der skal kompilleres igen og igen og igen for hvert besøg.

Jeg faldt over http://maurus.net/resources/programming-languages/... - ganske morsom - fx med if/boolean-konstruktionerne. Ganske morsomt at

 if ("false" == 0) echo "true\n";// => true, wtf


Hvis du vidste bare en smule om PHP så ville du også vide at der er === equal operatoren hvis du SKAL have en typestrict sammenligning..

Desuden er mange af bloggerens argumenter ikke aktuelle idag, såfremt du kører med den nyeste version af PHP5.. Men ja, PHP har sku sine fejl og mangler..

PS. Sjovt at denne blogger kan bashe PHP, og så bruge det selv på sin blog, selvmål imo.

Og hvad fanden har strict/loose type med OOP at gøre? Er javascript så heller ikke OOP eller hvad?
Gravatar #28 - cronick
6. jan. 2011 17:18
arne_v (25) skrev:
#24

Det er dybt mystisk for en Fortran/Pascal/C/C++/Java/C# udvikler.

Men for en PHP udvikler er det naturligt. Maaske vil en VB udvikler ogsaa finde det mindre overraskende.

Mne forskellige sprog har forskellige filosofier.


Med ordet "mystisk" formoder jeg, at der menes "forkert", trods de to ord er meget forskellige.

Nu har jeg ganske vist mest erfaring med PHP, men som en ganske habil udvikler i C# og VB finder jeg det ikke forkert, at PHP ikke er "strict type", som de fleste andre sprog. Jeg synes, der er ting, der både taler for og imod det.

Men man kan nok ikke finde de positive ting i sproget, hvis man ikke har roddet lidt mere intenst med det bag overfladen.
Gravatar #29 - arne_v
17. jan. 2011 02:16
cronick (28) skrev:
Med ordet "mystisk" formoder jeg, at der menes "forkert", trods de to ord er meget forskellige.


Nej jeg mener faktisk mystisk sådan i betydningen "WTF er det her for noget".
Gravatar #30 - cronick
26. jan. 2011 00:08
arne_v (29) skrev:
Nej jeg mener faktisk mystisk sådan i betydningen "WTF er det her for noget".


Forstod du ikke min forklaring? Såfremt du gjorde, så er der nu tale om, at du synes, det er forkert, frem for at det er mystisk, som i at du slet ikke forestår hvorfor det sker.
Gravatar #31 - Faergemeister
26. jan. 2011 00:27
cronick (30) skrev:
Forstod du ikke min forklaring? Såfremt du gjorde, så er der nu tale om, at du synes, det er forkert, frem for at det er mystisk, som i at du slet ikke forestår hvorfor det sker.


Du flueknepper og ligger ord i arne_v's mund. Ydermere river du en gammel tråd frem uden at bidrage med ngoet af betydning. Hold op med det.
Gravatar #32 - arne_v
26. jan. 2011 01:19
#30

Jeg må nok indrømme at mine evner ikke rækker til at forstå hvordan du kan få "Nej jeg mener faktisk mystisk sådan i betydningen ..." til at betyde "så er der nu tale om, at du synes, det er forkert, frem for at det er mystisk, ...".


Gravatar #33 - cronick
27. jan. 2011 22:47
Hm. Jeg må tilsyneladende have udtalt mig en smule tvetydigt.

Jeg er nu ikke ude på, at lægge ord i nogens mund. Jeg konstaterer blot, at der ikke kan være tale om, at noget er mystisk, hvis man har forståelse for dets koncept. Og SÅFREMT du har forstået essensen af hvorfor den omtalte kode gør, som den gør, må du finde et andet udtryk til at forklare din opfattelse af det - hvor ordet 'forkert' falder mest nærliggende, skulle du være negativ stemt overfor det faktum, at den gør det.
Gravatar #34 - arne_v
31. jan. 2011 01:22
cronick (33) skrev:
Jeg konstaterer blot, at der ikke kan være tale om, at noget er mystisk, hvis man har forståelse for dets koncept.


Nej, men det er jo lige præcis hvad de ikke har.

"WTF er det her for noget" betyder jo netop at de ikke har forstået konceptet.

cronick (33) skrev:
Og SÅFREMT du har forstået essensen af hvorfor den omtalte kode gør, som den gør, må du finde et andet udtryk til at forklare din opfattelse af det


????

Når jeg skriver "Det er dybt mystisk for en Fortran/Pascal/C/C++/Java/C# udvikler." så taler jeg faktisk ikke om mig og ikke om min opfattelse.
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login