当前位置:编程学习 > php >>

PHP之文件加密代码讲解

include_once(phpCodeZip.php);//载入函式
//建立加密文件(sourceDir要加密的php文件目录,targetDir加密后的文件目录)
$encryption = new PhoCodeZip(sourceDir,targetDir);
$encryption->zip();  //执行行加密

源代码下载:phpCodeZip.rar

  1. <?php
  2. /*
  3. * @license:MIT & GPL
  4. */
  5. class PhpCodeZip{
  6. //欲進行壓縮加密的來源資料夾
  7. var $sourceDir = .;
  8. //進行壓縮加密的存放的資料夾
  9. var $targetDir = tmp;
  10. //是否進行加密
  11. var $bcompiler = true;
  12. //是否去除空白註解斷行
  13. var $strip = true;
  14. //來源資料夾檔案路徑陣列
  15. var $sourcefilePaths = array();
  16. //目的資料夾檔案路徑陣列
  17. var $targetPaths = array();
  18. //進行壓縮加密前的資料夾大小
  19. var $sizeBeforeZip = null;
  20. //進行壓縮加密後的資料夾大小
  21. var $sizeAfterZip = null;
  22. //斷行的輸出
  23. var $newline = ;
  24. /**
  25. * 建構子
  26. *
  27. * @param string $sourceDir 來源資料夾
  28. * @param string $targetDir 目的資料夾
  29. * @param boolean $bcompiler 是否進行加密
  30. * @param boolean $strip 是否去除空白註解斷行
  31. * @return boolean
  32. */
  33. public function PhpCodeZip($sourceDir=.,$targetDir=tmp,$bcompiler=true,$strip=true){
  34. //配置初始變數
  35. $this->sourceDir = $sourceDir;
  36. $this->targetDir = $targetDir;
  37. $this->bcompiler = $bcompiler;
  38. //檢查來源資料是否存在
  39. if(!is_dir($this->sourceDir)){
  40. die(指定的來源資料夾.$this->sourceDir.不存在,請重新設定);
  41. } else {
  42. //如果指定的目的資料夾存在,砍掉重練
  43. if(is_dir($this->targetDir)){
  44. echo 【初始化目的地資料夾】.$this->newline.$this->newline;
  45. $this->cleanDir($this->targetDir,true);
  46. }
  47. //建立與來源資料夾結構一樣的目的資料夾
  48. mkdir($this->targetDir,0777);
  49. $dir_paths = $this->getPaths($this->sourceDir,*,GLOB_ONLYDIR);
  50. foreach($dir_paths as $key => $path){
  51. $path = explode(/,$path);
  52. $path[0] = $this->targetDir;
  53. echo => .join(/,$path).$this->newline;
  54. mkdir(join(/,$path),0777);
  55. }
  56. //取得來源資料夾的檔案路徑清單
  57. $this->sourcefilePaths = $this->getPaths($this->sourceDir,*);
  58. //配對應目的地的檔案路徑清單
  59. foreach($this->sourcefilePaths as $key => $path){
  60. //設定目的資料夾檔案路徑
  61. $path = explode(/,$path);
  62. $path[0] = $this->targetDir;
  63. $this->targetPaths[$key] = join(/,$path);
  64. }
  65. //記錄執行前的資料夾大小
  66. $this->sizeBeforeZip = $this->getSizeUnit($this->getDirSize($this->sourceDir),2);
  67. echo $this->newline.$this->newline;
  68. }
  69. }
  70. /**
  71. * 進行壓縮加密
  72. * @return boolean
  73. */
  74. public function zip(){
  75. $this->newline = ;
  76. echo 【開始進行加密程序】(資料夾大小:.$this->sizeBeforeZip.).$this->newline.$this->newline;
  77. //將來源檔案進行壓縮
  78. foreach($this->sourcefilePaths as $key => $path){
  79. if(is_file($path)){
  80. //取得檔案資訊
  81. $pathInfo = pathInfo($path);
  82. echo 讀取來源檔:.$path.$this->newline;
  83. //取得壓縮後的內容
  84. echo =>去除空白註解..........;
  85. if($this->strip && $pathInfo[extension] == php){
  86. $fileAterZip = php_strip_whitespace($path);
  87. } else {
  88. $fileAterZip = file_get_contents($path);
  89. }
  90. echo 完畢.$this->newline;
  91. //取壓縮後的內容寫到目的位置
  92. $fp = fopen($this->targetPaths[$key],w );
  93. echo =>寫入目的檔..........;
  94. fwrite($fp,$fileAterZip);
  95. fclose($fp);
  96. echo 完畢.$this->newline;
  97. //是否若選擇進行加密
  98. if($this->bcompiler && $pathInfo[extension] == php){
  99. echo =>加密原始檔..........;
  100. //複製原始檔
  101. $fh = fopen($this->targetPaths[$key].encrypt.php, "w");
  102. bcompiler_write_header($fh);
  103. bcompiler_write_file($fh, $this->targetPaths[$key]);
  104. bcompiler_write_footer($fh);
  105. fclose($fh);
  106. //刪除未加密的原始檔
  107. unlink($this->targetPaths[$key]);
  108. //重新命名加密過後的檔案
  109. rename($this->targetPaths[$key].encrypt.php,$this->targetPaths[$key]);
  110. echo 完畢.$this->newline;
  111. }
  112. echo $this->newline.$this->newline;
  113. }
  114. }
  115. //重新計算壓縮加密後的資料夾大小
  116. $this->sizeAfterZip = $this->getSizeUnit($this->getDirSize($this->targetDir),2);
  117. echo 【結束加密程序】.$this->newline.$this->newline;
  118. echo 《報告資訊》.$this->newline;
  119. echo 來源資料夾:.$this->sourceDir.(.$this->sizeBeforeZip.).$this->newline;
  120. echo 目的資料夾:.$this->targetDir.(.$this->sizeAfterZip.).$this->newline;
  121. echo 檔案大小增幅: .$this->getSizeUnit(($this->getDirSize($this->targetDir) - $this->getDirSize($this->sourceDir))).$this->newline;
  122. echo 檔案總數:.count($this->sourcefilePaths).個.$this->newline;
  123. }
  124. /**
  125. * 刪除目錄夾所有檔案
  126. *
  127. * @param string $dir 欲刪除的資料夾
  128. * @param boolean $deleteSelf 同時刪除資料夾
  129. * @return void
  130. */
  131. private function cleanDir($dir=.,$deleteSelf=true){
  132. if(!$dh = @opendir($dir)) return;
  133. while (($obj = readdir($dh))) {
  134. if($obj==. || $obj==..) continue;
  135. if (!@unlink($dir./.$obj)) $this->cleanDir($dir./.$obj, true);
  136. }
  137. if ($deleteSelf){
  138. closedir($dh);
  139. @rmdir($dir);
  140. }
  141. }
  142. /**
  143. * 取得資料夾的總檔案大小
  144. *
  145. * @param string $dir 欲剖析的資料夾
  146. * @return int 位元組
  147. */
  148. private function getDirSize($dir=.){
  149. //取得檔案路徑清單
  150. $filePaths = $this->getPaths($dir,*);
  151. //初始化計數器
  152. $sizeCounter = 0;
  153. foreach($filePaths as $key => $path){
  154. $sizeCounter = $sizeCounter filesize($path);
  155. }
  156. return ($sizeCounter);
  157. }
  158. /**
  159. * 取得資料夾所有配對的路徑
  160. *
  161. * @param string $start_dir 欲剖析的資料夾
  162. * @return array 檔案路徑陣列
  163. */
  164. private function getPaths($sDir, $sPattern, $nFlags = NULL){
  165. $sDir = escapeshellcmd($sDir);
  166. $aFiles = glob("$sDir/$sPattern", $nFlags);
  167. foreach (glob("$sDir/*", GLOB_ONLYDIR) as $sSubDir) {
  168. $aSubFiles = $this->getPaths($sSubDir, $sPattern, $nFlags);
  169. $aFiles = array_merge($aFiles, $aSubFiles);
  170. }
  171. return $aFiles;
  172. }
  173. /**
  174. * 檔案大小單位轉換函式
  175. *
  176. * @param int 檔案大小
  177. * @param int 小數點位數
  178. * @param boolean 是否要將資料切成陣列
  179. * @return mix 字串或陣列
  180. */
  181. public function getSizeUnit($size,$decimal=2,$split=false){
  182. //設定單位序列
  183. $unit = array(Bytes,KB,MB,GB,TB,PB,EB,ZB,YB);
  184. //初始化索引
  185. $flag = 0;
  186. //進行簡化除算
  187. while($size >= 1024){
  188. $size = $size / 1024;
  189. $flag ;
  190. }
  191. //是否要將數值與單位分開
  192. if($split){
  193. $sizeUnit = array(
  194. size => number_format($size,$decimal),
  195. unit => $unit[$flag]
  196. );
  197. } else {
  198. $sizeUnit = (number_format($size,$decimal)).$unit[$flag];
  199. }
  200. //回傳大小與單位
  201. return ($sizeUnit);
  202. }
  203. }
  204. ?>
补充:综合编程 , 安全编程 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,