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
PHP';的新输入筛选器不读取$\u GET或$\u POST数组_Php_Security_Filter Input - Fatal编程技术网

PHP';的新输入筛选器不读取$\u GET或$\u POST数组

PHP';的新输入筛选器不读取$\u GET或$\u POST数组,php,security,filter-input,Php,Security,Filter Input,在PHP 5.2中,添加了一个很好的安全函数,称为“input_filter”,因此没有说: $name = $_GET['name']; 你现在可以说: $name = filter_input (INPUT_GET, 'name', FILTER_SANITIZE_STRING); 它会自动清理字符串,还有: FILTER\u SANITIZE\u ENCODED FILTER\u SANITIZE\u NUMBER\u INT FILTER\u SANITIZE\u电子邮件 FILT

在PHP 5.2中,添加了一个很好的安全函数,称为“input_filter”,因此没有说:

$name = $_GET['name'];
你现在可以说:

$name = filter_input (INPUT_GET, 'name', FILTER_SANITIZE_STRING);
它会自动清理字符串,还有:

  • FILTER\u SANITIZE\u ENCODED
  • FILTER\u SANITIZE\u NUMBER\u INT
  • FILTER\u SANITIZE\u电子邮件
  • FILTER\u SANITIZE\u URL
等等。 所以这是一个非常方便的安全功能,我想完全切换到它

问题是。。。我经常在处理$\u GET和$\u POST数组之前对它们进行操作,如下所示:

$\u GET['name']='(默认名称)'

但filter\u input似乎无法访问$\u GET中的更改,因为它读取的是int(?)类型的“input\u GET”。如果我可以让filter\u输入改为读取$\u get,那就太好了,但是:

$name = filter_input ( $_GET, 'name', FILTER_SANITIZE_STRING );
给我一个错误:

Warning: filter_input() expects parameter 1 to be long, array given.
有人能想出一个方法让我:

  • 操纵
    INPUT\u GET
    (无论在何处)的源代码,以便我可以在filter\u INPUT读取它们之前更改其值
  • 获取过滤器\u输入以读取
    $\u获取
附录:


里奇问道:“你为什么要改变数组,你肯定希望它们是一个输入,而不是你通过编程插入的东西。”

这只是一个非常方便的预处理变量的地方,例如为了:

  • 设置默认值(如果$\u GET['state']='',则$\u GET['state']='AL')
  • 进行手动处理(删除所有空格等)
  • 安全性(其中一些将由filter_输入完成)

当我得到传入变量时,我就知道它是安全有效的。当然,我可以将$\u GET数组复制到另一个数组并处理该数组,但这只是一个不必要的步骤,因为I$\u GET已经是一个正常工作的数组,所以使用这些已经存在的系统数组进行操作是有意义的。

如果您手动更改数组,您肯定不需要对其进行SANATIZE吗?无论如何,为什么要更改数组呢?当然,您希望它们是一个输入,而不是通过编程插入的东西


也许更多的代码/上下文会有帮助。

输入的GET位只是一个标识符(数字),告诉PHP它需要从$\u GET获取值

如果要在整个数组上使用filter\u输入,需要循环遍历它,将每个数组键发送到filter\u输入,然后将结果放回$\u GET


编写一个自己进行清理的函数可能同样容易,而且还应该允许您处理数组中的数组(看起来filter_input不会这样做)。在PHP.net文档注释中有两个这样的示例函数,用于删除“魔术引号”。请参阅以获取示例。

您可以使用和手动强制它再次读取数组


在不修改全局数组的情况下执行此操作的简便方法:

if (!($name = filter_input(INPUT_GET, 'name'))) {
    $name = 'default_value';
}
或使用三元运算符:

$name = ($name = filter_input(INPUT_GET, 'name')) ? $name : 'default_value';

PHP的新输入过滤器不读取
$\u GET
$\u POST
数组。 如果您正在覆盖全局的(例如,
$\u GET
$\u POST
),则不要使用过滤器输入。
而是通过手动传递变量来使用
filter\u var($\u GET['name'],filter\u SANITIZE\u STRING)

正如Jrngs建议的那样:

跳过对超级全局请求变量的编程修改,定义并使用新的普通变量。 创建新变量不仅比访问和修改关联数组(带有字符串索引的数组)中的值快得多,而且通常也是一种更好的做法

filter_input函数的全部目的是最终消除超全局变量的使用,因为它们是所有PHP脚本中最危险的一点,也是最常见的安全漏洞(对于XSS和SQL注入)以及bug和混乱的原因,尤其是在大型项目中

例如,$\u GET和$\u REQUEST变量应该为同一个键返回相同的值,但是:

.../?var=1
var_dump($_GET['var']); ---> string '1' (length=1)
var_dump($_REQUEST['var']); ---> string '1' (length=1)
$_GET['var'] = 2;
var_dump($_GET['var']); ---> int 2
var_dump($_REQUEST['var']; ---> string '1' (length=1)
更不用说超全局变量在面向对象代码中几乎没有任何意义

因此,如果filter\u输入函数访问$\u GET/$\u POST/$\u REQUEST超全局变量,这将完全破坏此函数的作用。您肯定不应该为此使用建议的过滤器_var功能:

filter_var($_GET['var'],FILTER_SANITIZE_STRING); ---> JUST NO!

创建filter\u var函数的目的是为非请求变量提供过滤/清理功能,而不是为这种“黑客”提供过滤/清理功能。您所做的是从过滤器输入函数中获取过滤器,该函数最初是为了更好、更安全地访问请求数据而创建的,完全绕过该函数本身,以创建过滤器输入的方式访问请求数据,并对请求数据应用过滤器输入提供的过滤器。这完全是错误的

这应该是正确的答案,因为它解释了需要做什么。我被带到这里是因为同样的问题:我没有得到filter\u输入的用法。对于其他人来说,如果您这样使用它(假设您有$\u GET['foo']):filter\u input(input\u GET,'foo',flaghhere);输入不是来自$\u GET superglobal。好主意,但遗憾的是“default”选项不能用于此项。相反,您可以在变量名之前添加@符号(对于用户省略该参数的情况)。
filter_var($_GET['var'],FILTER_SANITIZE_STRING); ---> JUST NO!