Whouzuo: 001 = 1 und password_hash

Beitrag lesen

Hallo beisammen,

ich habe heute die Entdeckung gemacht, dass 01 das gleiche ist wie 1. Nicht lachen, es geht ja noch weiter ;)

01 = 1
001 = 1
0002 = 1

Prinzipiell stimmt das. Allerdings dachte ich nicht, dass die Nullen ignoriert werden. Ich beschreibe es mal kurz:

  • Ich habe eine Nutzer ID die ich einfach der Schönheit halber 5 Stellig haben möchte. Also fülle ich mit str_pad von links mit Nullen auf.
  • Ich erstelle einen Link darauß z.B.: /userprofil/00004 und fange die ID aus dem Link via mod_rewrite [1]{5}$ ab.
  • $_GET['ID'] enthält jetzt die Userid. Ich gebe mit echo aus und tatsächlich gibt er 00004 aus.
  • Ich zähle die länge mit count($_GET['ID']) und erhalte den wert 1. strlen ergibt das richtige Ergebnis von 5.

Bis hierhin ist es nicht schlimm. In der normalen Mathematik ist das ja richtig. Jetzt gehe ich aber dazu über, daten aus einer Datenbank zu holen und schreibe im sql query "ID = '. $_GET['ID'] .'". Da die ID in der Datenbank mit Auto Increment erstellt wird, gibt es keine vorhergehenden Nullen.

Jetzt ist meine Frage: Warum ist das so? Es ist in "Wirklichkeit" ja nicht exakt das gleiche - es sind ja zwei verschiedene zeichenkettenlängen von außen betrachtet.

Weil PHP einfach nur... ach lies selbst: http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design/

Wenn du die Chance hast, verwende eine vernünftige Sprache, bei der nicht solche komischen Typkonvertierungen durchführt. Bei Zeichenketten würde man erwarten, dass der Ausdruck ("01" == "1") FALSE ergibt und nicht TRUE.

Für mich ist es für das Skript natürlich "unwichtig". Ich muss dann nicht die Nullen vorne weg streichen um wieder die richtige ID zu haben. Die weitergehende Frage wäre für mich aber, in wie fern etwas manipuliert werden könnte? z.Z. kann ich mir nichts vorstellen, aber eventuell kommt es an irgendeiner stelle zu fehlern im skript. Ich weiß nicht wie ich das einschätzen soll, zu wenig erfahrung.

Wie gesagt, lies den Abschnitt "Operators" in meinem Link.


  1. \d ↩︎