Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 简单数值比较的安全性_Php_Security - Fatal编程技术网

Php 简单数值比较的安全性

Php 简单数值比较的安全性,php,security,Php,Security,好吧,我感觉我是在往回走,而不是向前走,我甚至不能自己判断一个简单的语句是否安全 首先,假设我们从url get方法获得一个变量: $my_number = $_GET['numb']; 现在我们做一个简单的if语句: if(($my_number >= 1) && ($my_number <= 12)) { put $my_number in database without escaping it } if($my_number>=1)&($my_nu

好吧,我感觉我是在往回走,而不是向前走,我甚至不能自己判断一个简单的语句是否安全

首先,假设我们从url get方法获得一个变量:

$my_number = $_GET['numb'];
现在我们做一个简单的if语句:

if(($my_number >= 1) && ($my_number <= 12))
{
    put $my_number in database without escaping it
}

if($my_number>=1)&($my_number您的代码未完全安全。用户可以通过除1-12之外的其他内容来传递此if条件。
您可以使用以下简单代码进行测试:

<?php

$my_number = $_GET['numb'];

if(is_numeric($my_number)){
if(($my_number >= 1) && ($my_number <= 12))
{
echo'User Can Pass';
}else{
echo'User Can Not Pass';
}
}else{
echo'User Can Not Pass';
}    
?>

现在像
http://example.com/?numb=8
http://example.com/?numb=15
http://example.com/?numb=7 武士


我想现在您可以找到答案了。谢谢。

要验证数字,请使用
intval()

$my_number = intval($_GET['numb']);
只允许一个数字。
这也将确保该值不会在SQL中创建错误

我不喜欢
=
=1)&&($myu number 0)&($myu number<13))

在数据库中放入$my_number而不转义它
如果这是一件事,则说明您做错了(显示导致insert语句的代码-用户输入是否应转义永远不应该是一个问题)。您可以尝试
将字符串强制转换为一个数字,然后
检查数字的范围,然后
使用准备好的语句或等效语句插入数据库中。我想,在这种情况下,代码是不必要的……比方说,我只需连接到数据库,然后执行$query=mysqli\u查询(我的连接,“UPDATE…SET column=$my_number WHERE…=…”;但我并不认为这段代码是必需的。您可以通过确保数字为整数来确保数字中没有任何棘手的问题:$my_number=intval($获取['numb']));您确实需要确保用户输入的值和格式是有效的。何必麻烦呢?逃避值或使用准备好的语句真的有那么难吗?
$my_number='0x0A';
$my_number='7 Samurai';
可能并不总是您想要或期望的;我认为
0x0A
不是一个数字。
$u GET['numb']
应该是一个数字。尝试替换我引用的那些值,并根据您的代码查看它们是否通过,这样您就可以理解为什么您被否决;或者尝试
$my_number=“1”或68=”66;放下所有桌子--“
如果$mynumber的计算结果为7{quote};drop table users;--介于1和12之间,该怎么办?注意:我不能在{quote}中加一个'。当我提交评论时,它会抛出一个错误。对不起,我已经更新了我的代码。谢谢@Mark Bakerintval()很好。我们倾向于使用filter\var($my\u number,filter\u VALIDATE\INT)。如果$my_number不是一个数字,则返回FALSE,而intval()将返回零-这是一个数字,当使用“>=0”之类的值时,这可能是一个问题,因为所有字符串都将匹配。intval()将值键入整数。如果传递的不是数值或为空,则它将转换为零。在这种情况下,如果($my_number>0
。那么在SQL中,该值不能为空,如果变量不放在单引号中,也不会产生错误。在这种情况下,您不会使用
filter_input()
而不是
var_filter()
?两件事。我没有很好地解释我自己…我完全同意intval()非常棒,因为它只返回数字。最近,零、假、空等等给我带来了麻烦-因此如果$my_number的值不是数字,那么使用非数字通常会很有帮助(仅对我和我的编程风格而言)。从历史上看,我部署的一些平台在filter_input()方面存在问题。不知道为什么,但这已经足够让我停止使用它了。我不同意你的观点,@误解,我只是提供了一种(定义不好的)不同的方法!零、假、空都是有问题的,特别是当函数可以返回零或假时,如
strpos()
。如果$pos!==false,则使用
。但是
intval()
的美妙之处在于,类型没有歧义,它永远不会返回false或null。我之所以使用
intval()
而不是
filter\u var()
,这是一种简单且更有效的方法。
if(($my_number >= 1) && ($my_number <= 12))
if(($my_number > 0) && ($my_number < 13))