PHP安全地转换$ _GET / $ _POST数组

时间:2012-01-16 14:52:24

标签: php post get extract

我正在检查我的脚本是否存在漏洞,并且过去曾经做过非常不安全的事情感到震惊:

foreach ($_GET as $key => $value){
    $$key = $value;
}

或更短

extract( $_GET );

我用firebug改变了一些POST / GET变量,以匹配我在脚本中使用的名称。如果名称被正确猜测,则可以覆盖

所以我认为我必须单独命名,如下所示: $ allowed_vars =

$allowed_vars = array("time","hotfile","netload","megaupload","user","pfda","xyz","sara","amount_needed");
    foreach ($_GET as $key => $value)
        {
             if (in_array($key,$allowed_vars))
                {
                    $$key = $value;
                }
        }

这种方式比单独命名它们节省了一些时间。

必须使用什么样的自动化?

4 个答案:

答案 0 :(得分:4)

我不使用任何类型的自动装置 我认为自动将请求变量分配给全局变量没有意义 如果它是一个或两个变量,我可以手动处理它们 如果有更多,我宁愿把它们作为数组成员保存,以方便处理。

然而,我正在使用某种类似于你的白名单方法。 但不是要从POST数据中创建全局变量,而是将该数据添加到SQL查询中。

就像在这个简单的辅助函数中生成SET语句一样:

function dbSet($fields) {
  $set='';
  foreach ($fields as $field) {
    if (isset($_POST[$field])) {
      $set.="`$field`='".mysql_real_escape_string($_POST[$field])."', ";
    }
  }
  return substr($set, 0, -2); 
}

$id     = intval($_POST['id']);
$fields = explode(" ","name surname lastname address zip fax phone");
$query  = "UPDATE $table SET ".dbSet($fields)." stamp=NOW() WHERE id=$id";

答案 1 :(得分:3)

你可以节省更多的时间,完全没有提供它们。只需从$ _GET数组中使用它们。这样做的好处不仅在于避免与脚本变量冲突(或更糟),而且在添加请求参数时也不必更新“自动化”。

当我使用POST数据时,从表单开始,我经常明确地处理每个数据:

$data = array();
$data['field1'] = someSaniFunction($_POST['field1']);
$data['field2'] = someOtherFunction($_POST['field2']);
...

通过这种方式,我确保每个字段都得到妥善处理,并且只触及我期望的字段。

答案 2 :(得分:0)

根据我的经验,你不应该使用$_REQUEST$$数组中的数据转换为变量,因为它可以覆盖当前范围内保存的变量。

相反,您应该考虑使用请求对象或数组来过滤数据,并且只访问您需要的命名变量。这样,您不必继续扩展允许的变量名称并仍然保持安全性。

例如,ZF有一个请求对象,他们建议在处理这些数据时使用输入过滤器: http://framework.zend.com/manual/en/zend.filter.input.html

答案 3 :(得分:0)

您可以更安全的方式使用提取功能:

extract($_REQUEST, EXTR_SKIP);

这不会覆盖代码中已存在的变量。有关您可以使用的其他参数,请参阅here