Php 此代码是否足够安全,可以满足最小和最大int

Php 此代码是否足够安全,可以满足最小和最大int,php,Php,所以,我已经用php创建了一些代码,现在我想知道它是否“足够安全”。代码如下: $amount=$\u POST['amount']; 如果($amount20){die(“最大金额为20”);} //这里有更多的东西 例如,是否有可能将$amount设置为50,然后仍然让它工作?在此之后,它将向带有编号的网页发送一个文件\u get\u contents,例如:https://example.com/amount.php?a=15。有没有可能在“这里有更多的东西”部分把15变成50 我只是好

所以,我已经用php创建了一些代码,现在我想知道它是否“足够安全”。代码如下:

$amount=$\u POST['amount'];
如果($amount<1){die(“最小amount为1”);}
如果($amount>20){die(“最大金额为20”);}
//这里有更多的东西
例如,是否有可能将
$amount
设置为50,然后仍然让它工作?在此之后,它将向带有编号的网页发送一个
文件\u get\u contents
,例如:
https://example.com/amount.php?a=15
。有没有可能在“这里有更多的东西”部分把15变成50

我只是好奇而已


编辑

这里是我使用的html



发送
这是我的完整php(例如)

if(设置($\u POST['amount'])){
$amount=$_POST['amount'];
如果($amount<1){die(“最小amount为1”);}
如果($amount>20){die(“最大金额为20”);}
$conn->query(“插入我的表格(金额)值(“$amount”)”;
文件获取内容(“https://example.com/file.php?a=“$amount);//A点
}
是否有可能在“A点”发送另一个号码?像
50

您需要:

$amount = (int)$_POST['amount'];
或者,用户可以输入以下内容:

3*3
这可能会导致您的
文件\u get\u内容出现问题('https://example.com/amount.php?a=3*3')


一个真正有问题的情况是这种输入:

7&a=8734
它将以
file\u get\u contents('https://example.com/amount.php?a=7&a=8734)

第二个
a
的值将获胜,因此example.com服务器将解释您的请求,就像您发送了
file\u get\u内容('https://example.com/amount.php?a=8734)

这种“攻击”之所以有效,是因为PHP的类型变戏法,它将
7&a=8734
转换为简单的
7
,用于比较,但您正在将非变戏法版本发送到example.com


这就是为什么
$amount=(int)$\u POST['amount']是正确的解决方案。

永远不要相信用户输入

这本身并不安全。用户可以通过检查工具操作表单,也可以使用PostMan发布任何他们想要的内容。A.1 3.5. 所有这些都是可行的投入。这还包括XSS、SQL注入等

也就是说,您需要先对输入进行消毒。我建议先使用is_numeric函数,如果它返回false,那么就死。在那之后你就知道了,事实上这是一个数字,你可以在上面查看范围

if(!is_numeric($amount))
    die();

代码有问题的一个示例:

通过发布如下值:

1'),('50'),('42
用户可以将多个值插入
my_表
,任何他们想要尝试的值


必须对查询中需要使用的任何值执行此操作。不要依赖于过滤、转义或施法。这并不是说它们不能工作,只是如果您习惯于在查询中直接使用变量,比如
INSERT。。。值(“$amount”)
您取决于您是否能够记住100%的时间进行过滤/转义/转换,而我们只是人类。

其他答案很好地解释了为什么这是不够的,但没有一个说明如何正确验证输入,这可以通过filter_var()完成,看起来像:

if (isset($_POST['amount'])) {
   $amount = $_POST['amount'];
   if(false===($amount=filter_var($amount,FILTER_VALIDATE_FLOAT)){
      http_response_code(400); // HTTP 400 Bad Request
      die("invalid amount (not a number)"); // show error page
   }
   // $amount is guaranteed to be a valid floating-point number,
   // also filter_var() did the typecast for us,
   // so $amount is now a php-native float.
   if ($amount < 1) { die("Min amount is 1."); }
   if ($amount > 20) { die("Max amount is 20."); }
   $conn->query("INSERT INTO my_table (amount) VALUES ('$amount')");
   file_get_contents("https://example.com/file.php?a=".$amount); // POINT A
}
if(设置($\u POST['amount'])){
$amount=$_POST['amount'];
if(false==($amount=filter\u var($amount,filter\u VALIDATE\u FLOAT)){
http_响应_代码(400);//http 400错误请求
骰子(“无效金额(不是数字)”;//显示错误页
}
//$amount保证为有效的浮点数,
//filter_var()也为我们做了类型转换,
//所以$amount现在是一个php本机浮点值。
如果($amount<1){die(“最小amount为1”);}
如果($amount>20){die(“最大金额为20”);}
$conn->query(“插入我的表格(金额)值(“$amount”)”;
文件获取内容(“https://example.com/file.php?a=“$amount);//A点
}
  • 如果$amount只能是整数,而不能是浮点数,则使用FILTER\u VALIDATE\u INT代替FILTER\u VALIDATE\u FLOAT

在“这里有更多的东西”部分,有可能把15变成50吗?是的
$amount=50;
甚至
$amount+=35;
但我指的是
$\u POST['amount']
if用户可以在数字输入位置输入一些内容,然后将其设置为50,并绕过检查其是否在1以下和20以上的2个if内容。您是否希望处理项目的分数,如
1.5
?,也没有任何东西会对
?a=15
起作用,因为您从
$\u POST['amount']
不是
$\u GET['a']
它在
//这里发送更多的东西
请求到
https://example.com/amount.php?a=$amount
中添加了更多变量。我在问他们是否能够以某种方式使
$amount
变量高于20,并且仍然让脚本发送请求。不,不是,但是如果将第二行更改为
$amount=(浮动)$_POST['amount'];
这样就足够了:)我的问题更像是:它在
//这里发送更多的东西
请求到
https://example.com/amount.php?a=$amount
中添加了一些变量。我在问他们是否能够以某种方式使
$amount
变量高于20,并且仍然让脚本发送请求。@AaronJonk是的,我看到了。
min=“1”max=“20”
不会节省您的时间,因为打开web浏览器控制台并删除这些内容非常简单。HTML是客户端的,因此没有任何安全性。您的服务器接受
$\u POST['amount']
,因此您需要在服务器端正确处理该值。但是,让人们知道最大值为20是件好事。(因为我正在使用引导程序,如果你试图克服它,它会弹出一些东西。)更多的是关于是否可能对我的网站造成伤害。@AaronJonk好的,那么我的答案的哪一部分是confus
if (isset($_POST['amount'])) {
   $amount = $_POST['amount'];
   if(false===($amount=filter_var($amount,FILTER_VALIDATE_FLOAT)){
      http_response_code(400); // HTTP 400 Bad Request
      die("invalid amount (not a number)"); // show error page
   }
   // $amount is guaranteed to be a valid floating-point number,
   // also filter_var() did the typecast for us,
   // so $amount is now a php-native float.
   if ($amount < 1) { die("Min amount is 1."); }
   if ($amount > 20) { die("Max amount is 20."); }
   $conn->query("INSERT INTO my_table (amount) VALUES ('$amount')");
   file_get_contents("https://example.com/file.php?a=".$amount); // POINT A
}