PHP';的新输入筛选器不读取$\u GET或$\u POST数组
在PHP 5.2中,添加了一个很好的安全函数,称为“input_filter”,因此没有说: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
$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
$name = filter_input ( $_GET, 'name', FILTER_SANITIZE_STRING );
给我一个错误:
Warning: filter_input() expects parameter 1 to be long, array given.
有人能想出一个方法让我:
- 操纵
(无论在何处)的源代码,以便我可以在filter\u INPUT读取它们之前更改其值INPUT\u GET
- 获取过滤器\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!