什么是读取PHP $ _REQUEST超全局的安全方法?

时间:2009-08-21 21:01:40

标签: php security superglobals

我试图以一种不会打开潜在安全问题的方式阅读获取参数。

我在想的是明确地将请求参数与我期望的匹配,然后为任何不匹配的东西设置默认值。

例如:

if ($_REQUEST['media'] == "video")
    $sort = "video";
elseif ($_REQUEST['media'] == "audio")
    $sort = "audio";
else
    $sort = "both";

这是否足够或需要进一步的步骤?

6 个答案:

答案 0 :(得分:5)

你提到的是安全的,但是过于冗长。使用PHP的数组操作可以让PHP为您处理脏工作:

$sort_valid = array('video', 'audio', 'both');
$sort = 'both'
if (isset($_REQUEST['media']) && in_array($_REQUEST['media'], $sort_valid)) {
    $sort = $_REQUEST['media'];
}

如果这种超全局解析在整个代码中很常见,你可以将它抽象为一个为你处理它的函数(就像许多大型PHP项目那样)。


正如Gavin所指出的,如果可能的话,使用您感兴趣的特定超全球(即$_GET$_POST$_COOKIE)也是一个好主意。现在看起来似乎并不重要,但是一些丑陋的错误可能会在三个超级全局之间发生命名冲突(例如sort中的$_COOKIE可能会引用搜索结果的默认排序,但是{{1} } sort中指的是升序或降序。)

答案 1 :(得分:5)

可能还值得注意的是(如果您担心安全性),不知道数据来自何处是相当不好的做法。您应该使用$ _GET,$ _POST或$ _SESSION,具体取决于交付方式。

答案 2 :(得分:1)

我会再增加一个条件:

    $sort = "both";
    if (array_key_exists('media', $_REQUEST))
    {
        if ($_REQUEST['media'] == "video")
            $sort = "video";
        elseif ($_REQUEST['media'] == "audio")
            $sort = "audio";
    }

是的,$ _REQUEST超全球是推荐阅读请求的方式。

答案 3 :(得分:1)

最简单的方法是:

$sort='both';
$sort_valid = array('video', 'audio');
if(isset($_REQUEST['media']) && in_array($_REQUEST['media'], $sort_valid)) $sort=$_REQUEST['media'];

答案 4 :(得分:1)

$valid = array("media" => array("both", "media", "video"), ... );
$default = array("media" => "both", ...);

...

// 1. drop invalid keys
$filtered_on_keys = array_key_intersect($_REQUEST, $valid);

// 2. drop invalid values
$filtered_on_values = array();

foreach($filtered_on_keys as $key => $value) {
  if (array_search($value, $_REQUEST($key) !== FALSE) {
    $filtered_on_values[$key] = $value;
  }
}

// 3. add missing defaults
$result = array_merge($defaults, $filtered_on_values);

答案 5 :(得分:1)

确保您知道数据的来源是最佳方式 //我们不接受GET方法,因此,我们设置$ media null
//如果方法等于post,我们解析成int,所以whateever会出现在$ _post,
//它不会在字符串模式下解析,我们也不需要检查sql是否受到伤害。

(isset($_GET['media']))? $media='': $media=(int)(isset($_POST['media'])) ? $_POST['media'] : '';

switch ($media) {
    case 1: $sort = "video"; break;
    case 2: $sort = "audio"; break;
    default: $sort = "both"; break;
}



顺便说一下,你可以阅读有关$ _SERVER ['REQUEST_METHOD']的信息
//我们在表单中使用POST方法,所以...

if($ _SERVER ['REQUEST_METHOD'] ==“GET”)标题('Location:http://www.disney.com/');