Rolf B: Führende Nullen

Beitrag lesen

Hallo TS,

Was unwahrscheinlich ist, bestimmt sicherlich in hohem Maße die Applikation.

Einverstanden. Wieviele Webseiten kennst Du, die Oktalzahlen oder Hexzahlen als regulären Input verwenden? Abgesehen von den Seiten, die sich mit deren Konvertierung befassen, oder mit Linux Dateirechten (einer der wenigen Anwendungsfälle von Oktalzahlen, abgesehen von Museumscomputern mit 24-bit Wortlänge oder 9-bit Bytes). Keine? Ich auch nicht. Aber wenn ich oktalen Input vom Anwender erwarte, ist es ja völlig okay, dass das mit einem opt-in aktiviert wird. Aktiviere ich es nicht, ist wohl davon auszugehen, dass die Anwendung mit Oktalzahlen nichts am Hut hat, und dann ist eine führende 0 auch kein Fehler. Sondern einfach eine 0. Der normale Mensch, der kein C-Programmierer ist, verbindet führende Nullen nicht mit Oktalzahlen. Selbst eine Menge C- oder PHP-Programmierer tun das nicht, und fallen auf 012 == 10 herein. Die führende 0 als Oktalkennung ist ein grundsätzlicher Mist der C-Syntax, keine Ahnung wer Dennis Ritchie da ins Gehirn geschissen hat (oder woher er das übernommen hat), und es ist größter Quatsch, sie bei einer Anwenderorientierten Funktion wie filter_input als unabschaltbare Komponente drin zu haben.

Was ist denn mit HEX-Notation?

Schrub ich doch: Wird bei 0x-Präfix und Freischaltung durch FILTER_FLAG_ALLOW_HEX akzeptiert und nach int konvertiert.

Was ich meinte, war: Das Feature, ein Präfix zu erkennen und zu verarbeiten, sollte per opt-in aktiviert oder per opt-out deaktiviert werden können. Die filter-Funktionen besitzen einen opt-in für die Konvertierung von Oktal oder Hex nach Dezimal, aber keinen opt-out für die Präfix-Erkennung. D.h. für den Fall, wo man Zahlenpräfixen nichts zu tun haben will, muss man einen eigenen Säuberungsschritt vorschalten - was die Funktion in diesem Fall so gut wie obsolet macht. Und das ist Bullshit im API.

Man braucht also einen dieser beiden Replace-Schritte, um die Oktalpräfix-Erkennung auszuhebeln.

$noOctal = preg_replace("/([^0-9])0*([0-9]+)/", "$1$2", $_POST["input"]);
$noOctal = preg_replace("/(?<![0-9])0*([0-9]+)/", "$1", $_POST["input"]);

Was wesentlich aufwändiger ist als es im Kern von filter_input zu tun - denn da ist die Präfixerkennung schon drin und man muss nur im "Oktalzweig" entscheiden, ob das Oktalpräfix zu beachten, zu ignorieren oder als Fehler zu melden ist.

Aber hilft ja nichts, der Bug ist rejected, wir können alle unsere Meinungen dazu haben und ein Pullrequest für PHP würde sicherlich nicht beachtet werden.

Rolf

--
sumpsi - posui - obstruxi