⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 archive_tar.php

📁 Joomla!是一套获得过多个奖项的内容管理系统(Content Management System, CMS)。Joomla!采用PHP+MySQL数据库开发
💻 PHP
📖 第 1 页 / 共 5 页
字号:
          $v_size = sprintf("%11s ", DecOct($p_size));        }        $v_uid = sprintf("%6s ", DecOct($p_uid));        $v_gid = sprintf("%6s ", DecOct($p_gid));        $v_perms = sprintf("%6s ", DecOct($p_perms));        $v_mtime = sprintf("%11s", DecOct($p_mtime));        $v_linkname = '';        $v_magic = '';        $v_version = '';        $v_uname = '';        $v_gname = '';        $v_devmajor = '';        $v_devminor = '';        $v_prefix = '';        $v_binary_data_first = pack("a100a8a8a8a12A12",		                            $p_filename, $v_perms, $v_uid, $v_gid,									$v_size, $v_mtime);        $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",		                           $p_type, $v_linkname, $v_magic,								   $v_version, $v_uname, $v_gname,								   $v_devmajor, $v_devminor, $v_prefix, '');        // ----- Calculate the checksum        $v_checksum = 0;        // ..... First part of the header        for ($i=0; $i<148; $i++)            $v_checksum += ord(substr($v_binary_data_first,$i,1));        // ..... Ignore the checksum value and replace it by ' ' (space)        for ($i=148; $i<156; $i++)            $v_checksum += ord(' ');        // ..... Last part of the header        for ($i=156, $j=0; $i<512; $i++, $j++)            $v_checksum += ord(substr($v_binary_data_last,$j,1));        // ----- Write the first 148 bytes of the header in the archive        $this->_writeBlock($v_binary_data_first, 148);        // ----- Write the calculated checksum        $v_checksum = sprintf("%6s ", DecOct($v_checksum));        $v_binary_data = pack("a8", $v_checksum);        $this->_writeBlock($v_binary_data, 8);        // ----- Write the last 356 bytes of the header in the archive        $this->_writeBlock($v_binary_data_last, 356);        return true;    }    // }}}    // {{{ _writeLongHeader()    function _writeLongHeader($p_filename)    {        $v_size = sprintf("%11s ", DecOct(strlen($p_filename)));        $v_typeflag = 'L';        $v_linkname = '';        $v_magic = '';        $v_version = '';        $v_uname = '';        $v_gname = '';        $v_devmajor = '';        $v_devminor = '';        $v_prefix = '';        $v_binary_data_first = pack("a100a8a8a8a12A12",		                            '././@LongLink', 0, 0, 0, $v_size, 0);        $v_binary_data_last = pack("a1a100a6a2a32a32a8a8a155a12",		                           $v_typeflag, $v_linkname, $v_magic,								   $v_version, $v_uname, $v_gname,								   $v_devmajor, $v_devminor, $v_prefix, '');        // ----- Calculate the checksum        $v_checksum = 0;        // ..... First part of the header        for ($i=0; $i<148; $i++)            $v_checksum += ord(substr($v_binary_data_first,$i,1));        // ..... Ignore the checksum value and replace it by ' ' (space)        for ($i=148; $i<156; $i++)            $v_checksum += ord(' ');        // ..... Last part of the header        for ($i=156, $j=0; $i<512; $i++, $j++)            $v_checksum += ord(substr($v_binary_data_last,$j,1));        // ----- Write the first 148 bytes of the header in the archive        $this->_writeBlock($v_binary_data_first, 148);        // ----- Write the calculated checksum        $v_checksum = sprintf("%6s ", DecOct($v_checksum));        $v_binary_data = pack("a8", $v_checksum);        $this->_writeBlock($v_binary_data, 8);        // ----- Write the last 356 bytes of the header in the archive        $this->_writeBlock($v_binary_data_last, 356);        // ----- Write the filename as content of the block        $i=0;        while (($v_buffer = substr($p_filename, (($i++)*512), 512)) != '') {            $v_binary_data = pack("a512", "$v_buffer");            $this->_writeBlock($v_binary_data);        }        return true;    }    // }}}    // {{{ _readHeader()    function _readHeader($v_binary_data, &$v_header)    {        if (strlen($v_binary_data)==0) {            $v_header['filename'] = '';            return true;        }        if (strlen($v_binary_data) != 512) {            $v_header['filename'] = '';            $this->_error('Invalid block size : '.strlen($v_binary_data));            return false;        }        if (!is_array($v_header)) {            $v_header = array();        }        // ----- Calculate the checksum        $v_checksum = 0;        // ..... First part of the header        for ($i=0; $i<148; $i++)            $v_checksum+=ord(substr($v_binary_data,$i,1));        // ..... Ignore the checksum value and replace it by ' ' (space)        for ($i=148; $i<156; $i++)            $v_checksum += ord(' ');        // ..... Last part of the header        for ($i=156; $i<512; $i++)           $v_checksum+=ord(substr($v_binary_data,$i,1));        $v_data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/"		                 ."a8checksum/a1typeflag/a100link/a6magic/a2version/"						 ."a32uname/a32gname/a8devmajor/a8devminor",						 $v_binary_data);        // ----- Extract the checksum        $v_header['checksum'] = OctDec(trim($v_data['checksum']));        if ($v_header['checksum'] != $v_checksum) {            $v_header['filename'] = '';            // ----- Look for last block (empty block)            if (($v_checksum == 256) && ($v_header['checksum'] == 0))                return true;            $this->_error('Invalid checksum for file "'.$v_data['filename']			              .'" : '.$v_checksum.' calculated, '						  .$v_header['checksum'].' expected');            return false;        }        // ----- Extract the properties        $v_header['filename'] = trim($v_data['filename']);        if ($this->_maliciousFilename($v_header['filename'])) {            $this->_error('Malicious .tar detected, file "' . $v_header['filename'] .                '" will not install in desired directory tree');            return false;        }        $v_header['mode'] = OctDec(trim($v_data['mode']));        $v_header['uid'] = OctDec(trim($v_data['uid']));        $v_header['gid'] = OctDec(trim($v_data['gid']));        $v_header['size'] = OctDec(trim($v_data['size']));        $v_header['mtime'] = OctDec(trim($v_data['mtime']));        if (($v_header['typeflag'] = $v_data['typeflag']) == "5") {          $v_header['size'] = 0;        }        $v_header['link'] = trim($v_data['link']);        /* ----- All these fields are removed form the header because		they do not carry interesting info        $v_header[magic] = trim($v_data[magic]);        $v_header[version] = trim($v_data[version]);        $v_header[uname] = trim($v_data[uname]);        $v_header[gname] = trim($v_data[gname]);        $v_header[devmajor] = trim($v_data[devmajor]);        $v_header[devminor] = trim($v_data[devminor]);        */        return true;    }    // }}}    // {{{ _maliciousFilename()    /**     * Detect and report a malicious file name     *     * @param string $file     * @return bool     * @access private     */    function _maliciousFilename($file)    {        if (strpos($file, '/../') !== false) {            return true;        }        if (strpos($file, '../') === 0) {            return true;        }        return false;    }    // }}}    // {{{ _readLongHeader()    function _readLongHeader(&$v_header)    {      $v_filename = '';      $n = floor($v_header['size']/512);      for ($i=0; $i<$n; $i++) {        $v_content = $this->_readBlock();        $v_filename .= $v_content;      }      if (($v_header['size'] % 512) != 0) {        $v_content = $this->_readBlock();        $v_filename .= $v_content;      }      // ----- Read the next header      $v_binary_data = $this->_readBlock();      if (!$this->_readHeader($v_binary_data, $v_header))        return false;      $v_filename = trim($v_filename);      $v_header['filename'] = $v_filename;        if ($this->_maliciousFilename($v_filename)) {            $this->_error('Malicious .tar detected, file "' . $v_filename .                '" will not install in desired directory tree');            return false;      }      return true;    }    // }}}    // {{{ _extractInString()    /**    * This method extract from the archive one file identified by $p_filename.    * The return value is a string with the file content, or NULL on error.    * @param string $p_filename     The path of the file to extract in a string.    * @return                       a string with the file content or NULL.    * @access private    */    function _extractInString($p_filename)    {        $v_result_str = "";        While (strlen($v_binary_data = $this->_readBlock()) != 0)        {          if (!$this->_readHeader($v_binary_data, $v_header))            return NULL;          if ($v_header['filename'] == '')            continue;          // ----- Look for long filename          if ($v_header['typeflag'] == 'L') {            if (!$this->_readLongHeader($v_header))              return NULL;          }          if ($v_header['filename'] == $p_filename) {              if ($v_header['typeflag'] == "5") {                  $this->_error('Unable to extract in string a directory '				                .'entry {'.$v_header['filename'].'}');                  return NULL;              } else {                  $n = floor($v_header['size']/512);                  for ($i=0; $i<$n; $i++) {                      $v_result_str .= $this->_readBlock();                  }                  if (($v_header['size'] % 512) != 0) {                      $v_content = $this->_readBlock();                      $v_result_str .= substr($v_content, 0,					                          ($v_header['size'] % 512));                  }                  return $v_result_str;              }          } else {              $this->_jumpBlock(ceil(($v_header['size']/512)));          }        }        return NULL;    }    // }}}    // {{{ _extractList()    function _extractList($p_path, &$p_list_detail, $p_mode,	                      $p_file_list, $p_remove_path)    {    $v_result=true;    $v_nb = 0;    $v_extract_all = true;    $v_listing = false;    $p_path = $this->_translateWinPath($p_path, false);    if ($p_path == '' || (substr($p_path, 0, 1) != '/'	    && substr($p_path, 0, 3) != "../" && !strpos($p_path, ':'))) {      $p_path = "./".$p_path;    }    $p_remove_path = $this->_translateWinPath($p_remove_path);    // ----- Look for path to remove format (should end by /)    if (($p_remove_path != '') && (substr($p_remove_path, -1) != '/'))      $p_remove_path .= '/';    $p_remove_path_size = strlen($p_remove_path);    switch ($p_mode) {      case "complete" :        $v_extract_all = TRUE;        $v_listing = FALSE;      break;      case "partial" :          $v_extract_all = FALSE;          $v_listing = FALSE;      break;      case "list" :          $v_extract_all = FALSE;          $v_listing = TRUE;      break;      default :        $this->_error('Invalid extract mode ('.$p_mode.')');        return false;    }    clearstatcache();    while (strlen($v_binary_data = $this->_readBlock()) != 0)    {      $v_extract_file = FALSE;      $v_extraction_stopped = 0;      if (!$this->_readHeader($v_binary_data, $v_header))        return false;      if ($v_header['filename'] == '') {        continue;      }      // ----- Look for long filename      if ($v_header['typeflag'] == 'L') {        if (!$this->_readLongHeader($v_header))          return false;      }      if ((!$v_extract_all) && (is_array($p_file_list))) {        // ----- By default no unzip if the file is not found        $v_extract_file = false;        for ($i=0; $i<sizeof($p_file_list); $i++) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -