Mailinglisten-Archive |
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" 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. -- Sebastian Mendel
php::bar PHP Wiki - Listenarchive