PHP-Bug im Vergleichsoperator == ?

Heute habe ich, zusammen mit einem Kollegen, feststellen müssen dass der Vergleichsoperator scheinbar ein Typecasting bei Vergleichen zwischen (etwaigen) Integerwerten und Strings vornimmt – und zwar immer zu Integer-Werten. Das hat zur Folge, dass Vergleiche mit „0“ mit einem String „abc“ zu einer wahren Aussage führen. Bei uns hat das eine „kleine“ Sicherheitslücke gerissen, die alles andere als schön war. Das ganze lässt sich unter Debian mit der PHP-Version 5.2.6-0.1~lenny1 und folgendem Code nachvollziehen:

$a = 0;
$b = "abdbbsb";
 
if($a == $b) echo 1;
else echo 0;
# Ausgabe 1

if((string)$a == $b) echo 1;
else echo 0;
# Ausgabe 0

if($a === $b) echo 1;
else echo 0;
# Ausgabe 0

3 Gedanken zu „PHP-Bug im Vergleichsoperator == ?“

    1. Stimmt – nur braucht man ziemlich lange um darauf zu stossen, wenn mans nicht vorher weiß. Eher nachlässig in Sachen Dokumentation (würde ich jetzt behaupten). Nen Bug ist es zugegebenermaßen nicht, aber es wäre (meiner Meinung nach) besser, wenn das auf diese Weise nicht passieren würde. Auch wenn PHP eine typfreie Sprache ist (weitestgehend).

      Der Titel war deswegen auch ne Frage 🙂

  1. Auch wenn der Artikel schon etwas älter ist, möchte ich anderen, die das Problem auch haben, ein wenig helfen:

    Ist aber ein wenig logisch, denn dadurch, dass du zuerst ein Ding hast, dass einem “Int” ähnelt und von php auch als Integer behandelt wird, denkt es sich “Oh, ich vergleiche Integer”… der interne Cast von “abdbbsb” auf Int wird intern wohl so gemacht:

    wandleInInteger(){
    return (int) “abdbbsb”;
    }

    Da beim vermeindlichen casten bzw. hier konvertieren eine exception auftritt liefert die das ding 0 zurück.

    Allerdings steht genau das auch so in der Doku unter “String conversion to numbers”:
    http://www.php.net/manual/en/language.types.string.php#language.types.string.conversion

    Das ist allerdings ganz cool wenn man gegen SQL-Injection ohne Prepared Statements arbeiten möchte und sich ein eigenes Framework dazu aufbauen möchte.

Kommentar verfassen