2013-08-02 116 views
4

我想知道是否有可能得到一个变量,无论是在POST或GET,然后使用filter_input()来消毒它。如何在使用filter_input的同时检查POST和GET数据?

起初我以为$var = filter_input(INPUT_POST | INPUT_GET, "var", FILTER_SANITIZE_STRING)可能工作,但它并没有和PHP手册说明你只能通过一种类型的输入。

我也试过INPUT_REQUEST,奇怪的是没有工作。该函数可以识别它(即不会抛出错误,说我在$ input中输入了错误),但它不会得到任何代码。是的,我知道不要在现场环境中使用INPUT_REQUEST,我只是纯粹测试它是否可行。

目前我做到以下几点:

$var = filter_input(INPUT_POST, "var", FILTER_SANITIZE_STRING); 
if(!$var) $var = filter_input(INPUT_GET, "var", FILTER_SANITIZE_STRING); 

但是在PHP中很多事情,往往有更简单的方式,将做这一切对我来说在一个命令。我想知道这是否是这种情况,我可以将它们组合成一张支票吗?我在谷歌上进行了粗略的搜索,甚至找不到任何人参考这个尝试,更不用说一个解决方案,所以现在我转向你很好的人。

+0

为了什么目的,你想“消毒”你的字符串? –

+0

为了确保在GET变量中没有输入任何恶意代码,或者在POST的情况下,某人没有篡改表单(它很可能是一个隐藏变量)并在其中放置了恶意代码。 – Styphon

+0

http://php.net/manual/en/function.filter-input.php - 正如所说的,第一个参数是常量之一,没有数组,没有||条款。如果你想用一行来完成,你必须建立一个接受数组的用户函数,然后将所有元素设置为第一个参数。然而,这似乎是不好的做法,因为你不知道你的输入是什么。 –

回答

3

如果您不知道您的输入是否在GETPOST中,则认为这是不好的做法。你应该总是知道而不是随意接受。

+0

大部分我都会同意这一点,而且我通常会坚持到一个或另一个。尽管我将数据发布到表单的某个页面上,但我也偶尔会遇到这种情况,但也像用户能够使用可用变量保存链接一样,可以更轻松地使用POST和GET类型。 – Styphon

+0

所以你说 - “我知道我的用例不好,但我仍然希望它得到支持”。 – Halcyon

+5

一点也不,我认为在大多数情况下这是不好的做法,尽管如此,与大多数情况一样,规则也有例外。 – Styphon

0

从我读的你可以改变你的形式POSTGET - 这样你只需要接受GET - 不知道我是否理解正确的方式。

1

我觉得没有比让一个自定义的函数,你已经提到的代码更好的方法:

function getPostOrGet($name) { 

    $var = filter_input(INPUT_POST, $name, FILTER_SANITIZE_STRING); 

    if(!$var) $var = filter_input(INPUT_GET, $name, FILTER_SANITIZE_STRING); 

    return $var; 

} 

如果你认为这是正常的,你不能使用|操作,因为这样如果在两者中都定义了它会发生什么。

另请注意,由于这是一种不好的做法,因此没有“简单”的方法。因此,如果您真的需要使用自定义函数,并且只使用正确的输入类型。

0

如果消毒正确你的输入,我会亲自测试filtre_input结果为null,因为if(!$var)条件可以通过像0一个falsy但现有的值被触发。

例如:

function getLatitude($name) { 
    $var = filter_input(INPUT_POST, 'latitude', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); 
    if($var === null){ 
     $var = filter_input(INPUT_GET, 'latitude', FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); 
    } 
    return $var; 
} 

与往常!$var条件和FILTER_SANITIZE_NUMBER_FLOAT,你会得到一个null值,而不是0

相关问题