Mailinglisten-Archive |
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