代码之家  ›  专栏  ›  技术社区  ›  Jeff Davis

什么是读取php$请求superglobal的安全方法?

  •  0
  • Jeff Davis  · 技术社区  · 16 年前

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

    我所想的是显式地将请求参数与我期望的匹配,然后为不匹配的内容设置默认值。

    例如:

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

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

    6 回复  |  直到 16 年前
        1
  •  5
  •   Michael Koval    16 年前

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

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

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


    正如加文指出的,使用您感兴趣的特定超级全局(即 $_GET , $_POST ,或 $_COOKIE )如果可能的话。它现在似乎并不重要,但是一些丑陋的错误很可能是命名冲突造成的,这三个超级全局(例如 sort 在里面 曲奇饼干 可以引用搜索结果的默认排序,但是 分类 在里面 $GET 指升序或降序)。

        2
  •  5
  •   Gavin Gilmour    16 年前

    可能也值得注意(如果您担心安全性),不知道数据来自何处是相当糟糕的做法。根据交付方法,您可能应该使用$\u get、$\u post或$\u会话。

        3
  •  1
  •   Byron Whitlock    16 年前

    我想再加一个条件:

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

    是的,建议使用$\u请求superglobal来读取请求。

        4
  •  1
  •   Thinker    16 年前

    最简单的方法是:

    $sort='both';
    $sort_valid = array('video', 'audio');
    if(isset($_REQUEST['media']) && in_array($_REQUEST['media'], $sort_valid)) $sort=$_REQUEST['media'];
    
        5
  •  1
  •   Zed    16 年前
    $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);
    
        6
  •  1
  •   OctaneFX    16 年前

    确保您知道数据来自哪里是最好的方法。
    //我们不接受get方法,所以我们将$media设置为空
    //如果方法等于post,我们解析为int,那么什么是在$\u 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;
    }
    



    顺便说一下,你可以读到关于$\u服务器['request\u method']

    //我们在表单中使用post方法,所以…

    if($_server['request_method']==“get”)header('位置: http://www.disney.com/ “”;

    推荐文章