1

我正在尝试以不会引发潜在安全问题的方式读取获取参数。

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

例如:

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

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

4

6 回答 6

6

你提到的是安全的,但过于冗长。使用 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,in$_COOKIE可能指的是搜索结果的默认排序,但sortin$_GET指的是升序或降序)。

于 2009-08-21T21:09:11.313 回答
6

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

于 2009-08-21T21:09:53.340 回答
2

我还要添加一个条件:

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

是的,$_REQUEST 超全局变量是读取请求的推荐方式。

于 2009-08-21T21:07:07.120 回答
2

最简单的方法是:

$sort='both';
$sort_valid = array('video', 'audio');
if(isset($_REQUEST['media']) && in_array($_REQUEST['media'], $sort_valid)) $sort=$_REQUEST['media'];
于 2009-08-21T21:11:39.937 回答
2
$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);
于 2009-08-21T21:14:48.073 回答
2

确保您知道数据来自哪里是最好的方法。
// 我们不接受 GET 方法,所以,我们设置 $media null
// 如果方法等于 post,我们解析成 int,所以无论 $_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") header('Location: http: //www.disney.com/ ');

于 2009-08-21T23:30:02.030 回答