PHP的新input_filter不读取$ _GET或$ _POST数组

Edw*_*uay 11 php security filter-input

在PHP 5.2中添加了一个很好的安全功能,名为"input_filter",所以不要说:

$name = $_GET['name'];
Run Code Online (Sandbox Code Playgroud)

你现在可以说:

$name = filter_input (INPUT_GET, 'name', FILTER_SANITIZE_STRING);
Run Code Online (Sandbox Code Playgroud)

它会自动清理你的字符串,还有:

  • FILTER_SANITIZE_ENCODED
  • FILTER_SANITIZE_NUMBER_INT
  • FILTER_SANITIZE_EMAIL
  • FILTER_SANITIZE_URL

所以这是一个非常方便的安全功能,我想完全切换到它.

问题是......在处理它们之前我经常操作$ _GET和$ _POST数组,如下所示:

$ _GET ['name'] ='(默认名称)';

但似乎filter_input无法访问$ _GET中的更改,因为它读取类型为int(?)的"INPUT_GET".如果我可以让filter_input改为读取$ _GET,那会很好,但是:

$name = filter_input ( $_GET, 'name', FILTER_SANITIZE_STRING );
Run Code Online (Sandbox Code Playgroud)

给我错误:

Warning: filter_input() expects parameter 1 to be long, array given.
Run Code Online (Sandbox Code Playgroud)

任何人都可以想到我能做到的方式:

  • 操纵INPUT_GET(无论是什么)的源,以便我可以在filter_input读取它们之前更改其值
  • 获取filter_input以进行读取 $_GET

ADDENDUM:


Rich问道:"为什么你要改变阵列,你肯定希望它们是一个输入,而不是你以编程方式插入的东西."

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

  • 设置默认值(如果$ _GET ['state'] =''然后$ _GET ['state'] ='AL')
  • 做手动处理(删除所有空格等)
  • 安全性(其中一些将由filter_input现在完成)

然后我知道当我得到传入变量时,它是安全有效的.当然,我可以将$ _GET数组复制到另一个数组并处理THAT数组,但这只是一个不必要的步骤,因为I $ _GET已经是一个正常运行的数组,因此使用已经存在的这些系统数组来实现它是有意义的.

Sim*_*mon 19

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

$name = filter_var ( $_GET['name'], FILTER_SANITIZE_STRING );
Run Code Online (Sandbox Code Playgroud)


Jrg*_*gns 6

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

if (!($name = filter_input(INPUT_GET, 'name'))) {
    $name = 'default_value';
}
Run Code Online (Sandbox Code Playgroud)

或使用三元运算符:

$name = ($name = filter_input(INPUT_GET, 'name')) ? $name : 'default_value';
Run Code Online (Sandbox Code Playgroud)