phpbar.de logo

Mailinglisten-Archive

[php] Modular - Multiplikation Problem

[php] Modular - Multiplikation Problem

Thomas Koudela thomas at koudela.net
Mit Nov 25 16:53:17 CET 2009


Am Mittwoch, den 25.11.2009, 15:39 +0100 schrieb Sebastian Mendel:
> Am 25.11.2009 14:37, schrieb Thomas Koudela:
> > Wenn ich alles richtig verstanden habe kann es richtig ärgerlich
> > werden, wenn jemand - wie ich ;-) - auf die Idee kommt ganzzahlige
> > Nutzereingaben oder Parameterübergaben, mit
> > $zahl = floor($_POST['Eingabe'])
> > oder
> > $zahl = round($_GET['Parameter'])
> > aus Vorsicht gegen SQL-Injections abzusichern.
> >
> > Wegen "When converting from float to integer, the number will be rounded
> > towards zero." und der in diesem Thread besprochenen
> > Darstellungsungenauigkeit könnte folgendes passieren:
> > - $_GET['DatensatzID'] ist mit '12324' bzw. einer "bösen"
> >    Ziffernfolge belegt.
> > - "UPDATE `wichtigeDaten`
> >    SET `datensatz`='$daten'
> >    WHERE `ID`=".floor($_GET['DatensatzID'])." LIMIT 1;";
> >    ändert jedoch den Datensatz mit der ID 12323 statt 12324, weil eine
> >    interne Typenkonvertierung über String hin zu Integer stattgefunden
> >    hat, welche einfach 0.9999999999999...926 abgeschnitten hat.
> 
> 
> dafür würde man dann ja auch ein explizites Casting verwenden, also
> 
> WHERE `ID`=" . (int) $_GET['DatensatzID'] . "
> 
> oder WHERE `ID`=" . int_val($_GET['DatensatzID']) . "
> 
> oder "prepared statements"

Dass eine sofortige Umwandlung (von String) in den Typ Integer, keine
Probleme mit der internen Darstellungsungenauigkeiten Floatzahlen mit
sich bringt, ist recht offensichtlich. ;)

Meine Frage war jedoch auf eine andere Sache gemünzt. Ich habe früher
statt int_val($_REQUEST['irgendwas']) eben floor($_REQUEST['irgendwas'])
benutzt, weil ich mir keine Gedanken über Probleme bei der
Typenumwandlung gemacht und nicht auf Typen geachtet habe. Ich ging
fälschlicherweise davon aus, dass Funktionen wie floor(), welche eine
Ganzzahl zurückgeben, diese als Integer zurückgeben. Und jetzt stelle
ich mir natürlich die Frage: Gibt es dadurch möglicherweise
Schwachstellen in meinen alten Programmen?

> bei "einer "bösen" Ziffernfolge"
> 
> ist die Problematik eh eine andere, du musst ja eh prüfen ob der 
> Benutzer diesen Datensatz überhaupt ändern darf.

Ich wollte nicht mit einem JOIN auf die Zugriffserlaubnistabelle oder
ähnlichem, die Abfrage unnötig verkomplizieren. Die "böse Ziffernfolge"
war auf die interne Darstellungsproblematik bezogen. Sorry, für diese
verbale Darstellungsproblematik meinerseits. :)

Schöne Grüße,
Thomas Koudela



php::bar PHP Wiki   -   Listenarchive