2012-10-08 7 views
6

Während Moodle's Quellcode gerade ich über diese gestolpert:base64_encode und PHP-Funktion serialisiert params

repository/letzten/lib.php

public function get_listing($encodedpath = '', $page = '') { 
    global $OUTPUT; 
    $ret = array(); 
    $ret['dynload'] = true; 
    $ret['nosearch'] = true; 
    $ret['nologin'] = true; 
    $list = array(); 
    $files = $this->get_recent_files(0, $this->number); 

    try { 
     foreach ($files as $file) { 
      $params = base64_encode(serialize($file)); 
      // Check that file exists and accessible 
      $filesize = $this->get_file_size($params); 
      if ($file['filename'] == 'image.png') { 
       var_dump($filesize); 
      } 
      if (!empty($filesize)) { 
       $node = array(
        'title' => $file['filename'], 
        'size' => $filesize, 
        'date' => '', 
        'source'=> $params, 
        'thumbnail' => $OUTPUT->pix_url(file_extension_icon($file['filename'], 32))->out(false), 
       ); 
       $list[] = $node; 
      } 
     } 
    } catch (Exception $e) { 
     throw new repository_exception('emptyfilelist', 'repository_recent'); 
    } 
    $ret['list'] = array_filter($list, array($this, 'filter')); 
    return $ret; 
} 

repository/lib.php

public function get_file_size($source) { 
    $browser = get_file_browser(); 
    $params  = unserialize(base64_decode($source)); 
    $contextid = clean_param($params['contextid'], PARAM_INT); 
    $fileitemid = clean_param($params['itemid'], PARAM_INT); 
    $filename = clean_param($params['filename'], PARAM_FILE); 
    $filepath = clean_param($params['filepath'], PARAM_PATH); 
    $filearea = clean_param($params['filearea'], PARAM_AREA); 
    $component = clean_param($params['component'], PARAM_COMPONENT); 
    $context = get_context_instance_by_id($contextid); 
    $file_info = $browser->get_file_info($context, $component, $filearea, $fileitemid, $filepath, $filename); 
    if (!empty($file_info)) { 
     $filesize = $file_info->get_filesize(); 
    } else { 
     $filesize = null; 
    } 
    return $filesize; 
} 

Meine Frage ist, was der Zweck der Codierung und Serialisierung von Base64 ist Wann wird es sofort innerhalb der Funktion rückgängig gemacht? Gibt es einen triftigen Grund dafür oder ist das einfach überentwickelt?

+0

Kein gültiger Grund dafür, es sei denn, dies ist eine wirklich große Ausnahme und die häufigste Verwendung von 'get_file_size' ist bei weitem die Dateigröße eines' serialize'd, 'base64_encode'd Objekts. – Ryan

+0

['Funktion get_file_size'] (http://xref.schoolsict.net/moodle/2.2/nav.html?repository/lib.php.source.html#l1367) in moodle Quelle – air4x

+0

Kannst du den folgenden Code anzeigen? Aufruf an '$ this-> get_file_size()'? – NullUserException

Antwort

2

Ein kurzer Klick um in ihrer PHPXref zeigt, dass diese Funktion auch in repository_ajax.php

Passing serialisierten Daten um in einem Query-String/Formularfeld einfach gehen (potentiell) genannt wird, ist nicht zu arbeiten, aber mit Base64-Codierung Das ist kein Problem.

Also die Funktion wurde entwickelt, um Anfragen über Ajax, Base64-Dekodierung, Deserialisierung zu behandeln und dann die Dateigröße zurückzugeben. (Dies ist wahrscheinlich auch mit dem Element source des Listenknotens verknüpft.)

Im Wesentlichen überprüft der Aufruf, ob die codierte Zeichenfolge gültig ist, wenn sie später in der Ajax-Anforderung verwendet wird.