在PHP 5.2中添加了一个很好的安全功能,名为"input_filter",所以不要说:
$name = $_GET['name'];
你现在可以说:
$name = filter_input (INPUT_GET, 'name', FILTER_SANITIZE_STRING);
它会自动清理你的字符串,还有:
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 );
给我错误:
Warning: filter_input() expects parameter 1 to be long, array given.
任何人都可以想到我能做到的方式:
操纵INPUT_GET
(无论是什么)的源,以便我可以在filter_input读取它们之前更改其值
获取filter_input以进行读取 $_GET
ADDENDUM:
Rich问道:"为什么你要改变阵列,你肯定希望它们是一个输入,而不是你以编程方式插入的东西."
这是预处理变量的一个非常方便的地方,例如为了:
设置默认值(如果$ _GET ['state'] =''然后$ _GET ['state'] ='AL')
做手动处理(删除所有空格等)
安全性(其中一些将由filter_input现在完成)
然后我知道当我得到传入变量时,它是安全有效的.当然,我可以将$ _GET数组复制到另一个数组并处理THAT数组,但这只是一个不必要的步骤,因为I $ _GET已经是一个正常运行的数组,因此使用已经存在的这些系统数组来实现它是有意义的.
您可以使用filter_var和filter_var_array手动强制它再次读取数组
$name = filter_var ( $_GET['name'], FILTER_SANITIZE_STRING );
在不修改全局数组的情况下执行此操作的便捷方法:
if (!($name = filter_input(INPUT_GET, 'name'))) { $name = 'default_value'; }
或使用三元运算符:
$name = ($name = filter_input(INPUT_GET, 'name')) ? $name : 'default_value';