2014-09-04 58 views
0

所以我有一个带有2个文本输入的表单。 一个是价格,另一个是数量。 在保存表单之前,有一些检查可以防止篡改用户输入和SQL注入。防止篡改用户输入和SQL注入失败

所以其中之一是:

if(strval(floatval($quantity)) === $quantity && strval(floatval($price)) === price) { 
     $errors = false; 
    } 

与此检查的问题是,如果我们有$价格=“47.80”例如 floatval()为我们提供了47.8,然后strval()给了我们“ 47.8“,这不等于”47.80“ 所以检查失败,我们得到一个错误。

我想知道你是否可以想办法解决这个问题,而不必更改逻辑。

+3

这是为什么?如果你的数量是整数 - 检查它是否是整数。如果你的价格是浮动的 - 检查它是否浮动。例如,对于字符串表示的数字,存在诸如“is_numeric()”之类的东西。但真的:[this](http://us1.php.net/filter_var)和[this](http://us1.php.net/ctype) – 2014-09-04 10:54:07

+0

真正的解决方案是使用准备好的语句,而不必担心关于sql注入。 – 2014-09-04 10:55:55

+0

这不是一个浮动。它实际上是一个来自数据库的字符串。它也存储为一个字符串。再加上输入是一个带有字符串值的文本框。这就是表单的方式,就像我说过的,我不想因为各种原因而改变它。所以我必须找到一种方法来操纵它。 – 2014-09-04 10:55:57

回答

0

您可以使用过滤器扩展:

$price = filter_var($price, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); 

它删除一切,不是一个数字或一个周期。

如果数字必须有两个小数点,那么你必须以某种方式强制执行。您可以不允许没有两位小数的数字,也可以自己修改输入。像这样的事情应该这样做:

$price= number_format($price, 2, '.', null);