This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /** |
||
3 | * @check if login |
||
4 | * @method: |
||
5 | * @license http://www.blags.org/ |
||
6 | * @created :2010年07月24日 15时58分 |
||
7 | * @copyright 1997-2010 The Martin Group |
||
8 | * @author Martin <[email protected]> |
||
9 | * */ |
||
10 | include "../../../mainfile.php"; |
||
11 | //验证密码 |
||
12 | $password = "123465"; |
||
13 | |||
14 | global $xoopsUser; |
||
15 | if (!$xoopsUser) { |
||
16 | redirect_header(XOOPS_URL . '/user.php?xoops_redirect=/' . $_SERVER['REQUEST_URI'], 1, '您还没有登录.'); |
||
17 | } |
||
18 | $isAdmin = $xoopsUser->isAdmin(); |
||
19 | //var_dump($xoopsUser); |
||
20 | ?> |
||
21 | <html> |
||
22 | <head> |
||
23 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
||
24 | <title>ZIP压缩程序</title> |
||
25 | <style type="text/css"> |
||
26 | <!-- |
||
27 | body, td { |
||
28 | font-size: 14px; |
||
29 | color: #000000; |
||
30 | } |
||
31 | |||
32 | a { |
||
33 | color: #000066; |
||
34 | text-decoration: none; |
||
35 | } |
||
36 | |||
37 | a:hover { |
||
38 | color: #FF6600; |
||
39 | text-decoration: underline; |
||
40 | } |
||
41 | |||
42 | --> |
||
43 | </style> |
||
44 | </head> |
||
45 | |||
46 | <body> |
||
47 | <form name="myform" method="post" action="index.php"> |
||
48 | <font color="#FF0000">在线压缩ZIP文件程序</font><br> |
||
49 | |||
50 | <div style="color:#FF9900"> |
||
51 | <p>使用方法:选定要压缩的文件或目录(包含子目录),即可开始压缩。</p> |
||
52 | <p>压缩的结果保留原来的目录结构。</p> |
||
53 | </div> |
||
54 | <? |
||
55 | if (!$_REQUEST["myaction"]): |
||
56 | ?> |
||
57 | <table width="100%" border="0" cellspacing="0" cellpadding="0"> |
||
58 | <tr> |
||
59 | <td width="11%">验证密码:</td> |
||
60 | <td width="89%"><input name="password" type="password" id="password" size="15"></td> |
||
61 | </tr> |
||
62 | <tr> |
||
63 | <td><input name="myaction" type="hidden" id="myaction" value="dolist"></td> |
||
64 | <td><input type="submit" name="Submit" value=" 进 入 "></td> |
||
65 | </tr> |
||
66 | </table> |
||
67 | <? |
||
68 | |||
69 | elseif ($_REQUEST["myaction"] === "dolist"): |
||
70 | if ($_REQUEST['password'] != $password) { |
||
71 | die("输入的密码不正确,请重新输入。"); |
||
72 | } |
||
73 | echo "选择要压缩的文件或目录:<br>"; |
||
74 | $www_path = '../../../../'; |
||
75 | $fdir = opendir($www_path); |
||
76 | while ($file = readdir($fdir)) { |
||
77 | if ($file === '.' || $file === '..') { |
||
78 | continue; |
||
79 | } |
||
80 | echo "<input name='dfile[]' type='checkbox' value='$www_path$file' " . ($file == basename(__FILE__) ? "" : "checked") . "> "; |
||
81 | if (is_file($file)) { |
||
82 | echo "文件: $file<br>"; |
||
83 | } else { |
||
84 | echo "目录: $file<br>"; |
||
85 | } |
||
86 | } |
||
87 | ?> |
||
88 | <br> |
||
89 | 压缩文件保存到目录: |
||
90 | <input name="todir" type="hidden" id="todir" value="" size="15"> |
||
91 | (留空为本目录,必须有写入权限)<br> |
||
92 | 压缩文件名称: |
||
93 | <input name="zipname" type="text" id="zipname" value="zip.zip" size="15"> |
||
94 | (.zip)<br> |
||
95 | <br> |
||
96 | <input name="password" type="hidden" id="password" value="<?= $_POST['password']; ?>"> |
||
97 | <input name="myaction" type="hidden" id="myaction" value="dozip"> |
||
98 | <input type='button' value='反选' onclick='selrev();'> |
||
99 | <input type="submit" name="Submit" value=" 开始压缩 "> |
||
100 | <script language='javascript'> |
||
101 | function selrev() { |
||
102 | with (document.myform) { |
||
103 | for (i = 0; i < elements.length; i++) { |
||
104 | thiselm = elements[i]; |
||
105 | if (thiselm.name.match(/dfile\[]/)) thiselm.checked = !thiselm.checked; |
||
106 | } |
||
107 | } |
||
108 | } |
||
109 | </script> |
||
110 | <? |
||
111 | |||
112 | elseif ($_REQUEST["myaction"] === "dozip"): |
||
113 | |||
114 | // set_time_limit(0); |
||
115 | |||
116 | /** |
||
117 | * Class PHPzip |
||
118 | */ |
||
119 | class PHPzip |
||
120 | { |
||
121 | |||
122 | var $file_count = 0; |
||
123 | var $datastr_len = 0; |
||
124 | var $dirstr_len = 0; |
||
125 | var $filedata = ''; //该变量只被类外部程序访问 |
||
126 | var $gzfilename; |
||
127 | var $fp; |
||
128 | var $dirstr = ''; |
||
129 | |||
130 | /* |
||
131 | 返回文件的修改时间格式. |
||
132 | 只为本类内部函数调用. |
||
133 | */ |
||
134 | /** |
||
135 | * @param int $unixtime |
||
136 | * @return int |
||
137 | */ |
||
138 | function unix2DosTime($unixtime = 0) |
||
139 | { |
||
140 | $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime); |
||
141 | |||
142 | if ($timearray['year'] < 1980) { |
||
143 | $timearray['year'] = 1980; |
||
144 | $timearray['mon'] = 1; |
||
145 | $timearray['mday'] = 1; |
||
146 | $timearray['hours'] = 0; |
||
147 | $timearray['minutes'] = 0; |
||
148 | $timearray['seconds'] = 0; |
||
149 | } |
||
150 | |||
151 | return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1); |
||
152 | } |
||
153 | |||
154 | /* |
||
155 | 初始化文件,建立文件目录, |
||
156 | 并返回文件的写入权限. |
||
157 | */ |
||
158 | /** |
||
159 | * @param string $path |
||
160 | * @return bool |
||
161 | */ |
||
162 | function startfile($path = 'shenbin.zip') |
||
163 | { |
||
164 | $this->gzfilename = $path; |
||
165 | $mypathdir = array(); |
||
166 | do { |
||
167 | $mypathdir[] = $path = dirname($path); |
||
168 | } while ($path !== '.'); |
||
169 | @end($mypathdir); |
||
170 | do { |
||
171 | $path = @current($mypathdir); |
||
172 | @mkdir($path); |
||
173 | } while (@prev($mypathdir)); |
||
174 | |||
175 | if ($this->fp = @fopen($this->gzfilename, "w")) { |
||
176 | return true; |
||
177 | } |
||
178 | |||
179 | return false; |
||
180 | } |
||
181 | |||
182 | /* |
||
183 | 添加一个文件到 zip 压缩包中. |
||
184 | */ |
||
185 | /** |
||
186 | * @param $data |
||
187 | * @param $name |
||
188 | */ |
||
189 | function addfile($data, $name) |
||
190 | { |
||
191 | $name = str_replace('\\', '/', $name); |
||
192 | |||
193 | if (strrchr($name, '/') === '/') { |
||
194 | return $this->adddir($name); |
||
195 | } |
||
196 | |||
197 | $dtime = dechex($this->unix2DosTime()); |
||
198 | $hexdtime = '\x' . $dtime[6] . $dtime[7] . '\x' . $dtime[4] . $dtime[5] . '\x' . $dtime[2] . $dtime[3] . '\x' . $dtime[0] . $dtime[1]; |
||
199 | eval('$hexdtime = "' . $hexdtime . '";'); |
||
200 | |||
201 | $unc_len = strlen($data); |
||
202 | $crc = crc32($data); |
||
203 | $zdata = gzcompress($data); |
||
204 | $c_len = strlen($zdata); |
||
205 | $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); |
||
206 | |||
207 | //新添文件内容格式化: |
||
208 | $datastr = "\x50\x4b\x03\x04"; |
||
209 | $datastr .= "\x14\x00"; // ver needed to extract |
||
210 | $datastr .= "\x00\x00"; // gen purpose bit flag |
||
211 | $datastr .= "\x08\x00"; // compression method |
||
212 | $datastr .= $hexdtime; // last mod time and date |
||
213 | $datastr .= pack('V', $crc); // crc32 |
||
214 | $datastr .= pack('V', $c_len); // compressed filesize |
||
215 | $datastr .= pack('V', $unc_len); // uncompressed filesize |
||
216 | $datastr .= pack('v', strlen($name)); // length of filename |
||
217 | $datastr .= pack('v', 0); // extra field length |
||
218 | $datastr .= $name; |
||
219 | $datastr .= $zdata; |
||
220 | $datastr .= pack('V', $crc); // crc32 |
||
221 | $datastr .= pack('V', $c_len); // compressed filesize |
||
222 | $datastr .= pack('V', $unc_len); // uncompressed filesize |
||
223 | |||
224 | fwrite($this->fp, $datastr); //写入新的文件内容 |
||
225 | $my_datastr_len = strlen($datastr); |
||
226 | unset($datastr); |
||
227 | |||
228 | //新添文件目录信息 |
||
229 | $dirstr = "\x50\x4b\x01\x02"; |
||
230 | $dirstr .= "\x00\x00"; // version made by |
||
231 | $dirstr .= "\x14\x00"; // version needed to extract |
||
232 | $dirstr .= "\x00\x00"; // gen purpose bit flag |
||
233 | $dirstr .= "\x08\x00"; // compression method |
||
234 | $dirstr .= $hexdtime; // last mod time & date |
||
235 | $dirstr .= pack('V', $crc); // crc32 |
||
236 | $dirstr .= pack('V', $c_len); // compressed filesize |
||
237 | $dirstr .= pack('V', $unc_len); // uncompressed filesize |
||
238 | $dirstr .= pack('v', strlen($name)); // length of filename |
||
239 | $dirstr .= pack('v', 0); // extra field length |
||
240 | $dirstr .= pack('v', 0); // file comment length |
||
241 | $dirstr .= pack('v', 0); // disk number start |
||
242 | $dirstr .= pack('v', 0); // internal file attributes |
||
243 | $dirstr .= pack('V', 32); // external file attributes - 'archive' bit set |
||
244 | $dirstr .= pack('V', $this->datastr_len); // relative offset of local header |
||
245 | $dirstr .= $name; |
||
246 | |||
247 | $this->dirstr .= $dirstr; //目录信息 |
||
248 | |||
249 | $this->file_count++; |
||
250 | $this->dirstr_len += strlen($dirstr); |
||
251 | $this->datastr_len += $my_datastr_len; |
||
252 | } |
||
253 | |||
254 | /** |
||
255 | * @param $name |
||
256 | */ |
||
257 | function adddir($name) |
||
258 | { |
||
259 | $name = str_replace("\\", "/", $name); |
||
260 | $datastr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"; |
||
261 | |||
262 | $datastr .= pack("V", 0) . pack("V", 0) . pack("V", 0) . pack("v", strlen($name)); |
||
263 | $datastr .= pack("v", 0) . $name . pack("V", 0) . pack("V", 0) . pack("V", 0); |
||
264 | |||
265 | fwrite($this->fp, $datastr); //写入新的文件内容 |
||
266 | $my_datastr_len = strlen($datastr); |
||
267 | unset($datastr); |
||
268 | |||
269 | $dirstr = "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00"; |
||
270 | $dirstr .= pack("V", 0) . pack("V", 0) . pack("V", 0) . pack("v", strlen($name)); |
||
271 | $dirstr .= pack("v", 0) . pack("v", 0) . pack("v", 0) . pack("v", 0); |
||
272 | $dirstr .= pack("V", 16) . pack("V", $this->datastr_len) . $name; |
||
273 | |||
274 | $this->dirstr .= $dirstr; //目录信息 |
||
275 | |||
276 | $this->file_count++; |
||
277 | $this->dirstr_len += strlen($dirstr); |
||
278 | $this->datastr_len += $my_datastr_len; |
||
279 | } |
||
280 | |||
281 | function createfile() |
||
282 | { |
||
283 | //压缩包结束信息,包括文件总数,目录信息读取指针位置等信息 |
||
284 | $endstr = "\x50\x4b\x05\x06\x00\x00\x00\x00" . pack('v', $this->file_count) . pack('v', $this->file_count) . pack('V', $this->dirstr_len) . pack('V', $this->datastr_len) . "\x00\x00"; |
||
285 | |||
286 | fwrite($this->fp, $this->dirstr . $endstr); |
||
287 | fclose($this->fp); |
||
288 | } |
||
289 | } |
||
290 | |||
291 | if (!trim($_REQUEST[zipname])) { |
||
292 | $_REQUEST[zipname] = "shenbin.zip"; |
||
293 | } else { |
||
294 | $_REQUEST[zipname] = trim($_REQUEST[zipname]); |
||
295 | } |
||
296 | if (!strrchr(strtolower($_REQUEST[zipname]), '.') === '.zip') { |
||
297 | $_REQUEST[zipname] .= ".zip"; |
||
298 | } |
||
299 | $_REQUEST[todir] = str_replace('\\', '/', trim($_REQUEST[todir])); |
||
300 | if (!strrchr(strtolower($_REQUEST[todir]), '/') === '/') { |
||
301 | $_REQUEST[todir] .= "/"; |
||
302 | } |
||
303 | if ($_REQUEST[todir] === "/") { |
||
304 | $_REQUEST[todir] = "./"; |
||
305 | } |
||
306 | |||
307 | /** |
||
308 | * @param string $dir |
||
309 | * @return int |
||
310 | */ |
||
311 | function listfiles($dir = ".") |
||
312 | { |
||
313 | global $faisunZIP; |
||
314 | $sub_file_num = 0; |
||
315 | |||
316 | if (is_file("$dir")) { |
||
317 | if (realpath($faisunZIP->gzfilename) != realpath("$dir")) { |
||
318 | $faisunZIP->addfile(implode('', file("$dir")), "$dir"); |
||
319 | |||
320 | return 1; |
||
321 | } |
||
322 | |||
323 | return 0; |
||
324 | } |
||
325 | |||
326 | $handle = opendir("$dir"); |
||
327 | while ($file = readdir($handle)) { |
||
328 | if ($file === "." || $file === "..") { |
||
329 | continue; |
||
330 | } |
||
331 | if (is_dir("$dir/$file")) { |
||
332 | $sub_file_num += listfiles("$dir/$file"); |
||
333 | } else { |
||
334 | if (realpath($faisunZIP->gzfilename) != realpath("$dir/$file")) { |
||
335 | $faisunZIP->addfile(implode('', file("$dir/$file")), "$dir/$file"); |
||
336 | $sub_file_num++; |
||
337 | } |
||
338 | } |
||
339 | } |
||
340 | closedir($handle); |
||
341 | if (!$sub_file_num) { |
||
342 | $faisunZIP->addfile("", "$dir/"); |
||
343 | } |
||
344 | |||
345 | return $sub_file_num; |
||
346 | } |
||
347 | |||
348 | /** |
||
349 | * @param $num |
||
350 | * @return string |
||
351 | */ |
||
352 | function num_bitunit($num) |
||
353 | { |
||
354 | $bitunit = array(' B', ' KB', ' MB', ' GB'); |
||
355 | for ($key = 0; $key < count($bitunit); $key++) { |
||
0 ignored issues
–
show
|
|||
356 | if ($num >= pow(2, 10 * $key) - 1) { //1023B 会显示为 1KB |
||
357 | $num_bitunit_str = (ceil($num / pow(2, 10 * $key) * 100) / 100) . " $bitunit[$key]"; |
||
358 | } |
||
359 | } |
||
360 | |||
361 | return $num_bitunit_str; |
||
362 | } |
||
363 | |||
364 | if (is_array($_REQUEST[dfile])) { |
||
365 | $faisunZIP = new PHPzip; |
||
366 | if ($faisunZIP->startfile("$_REQUEST[todir]$_REQUEST[zipname]")) { |
||
367 | echo "正在添加压缩文件...<br><br>"; |
||
368 | $filenum = 0; |
||
369 | foreach ($_REQUEST[dfile] as $file) { |
||
370 | if (is_file($file)) { |
||
371 | echo "文件: $file<br>"; |
||
372 | } else { |
||
373 | echo "目录: $file<br>"; |
||
374 | } |
||
375 | $filenum += listfiles($file); |
||
376 | } |
||
377 | $faisunZIP->createfile(); |
||
378 | echo "<br>压缩完成,共添加 $filenum 个文件.<br><a href='$_REQUEST[todir]$_REQUEST[zipname]'>$_REQUEST[todir]$_REQUEST[zipname] (" . num_bitunit(filesize("$_REQUEST[todir]$_REQUEST[zipname]")) . ")</a>"; |
||
379 | } else { |
||
380 | echo "$_REQUEST[todir]$_REQUEST[zipname] 不能写入,请检查路径或权限是否正确.<br>"; |
||
381 | } |
||
382 | } else { |
||
383 | echo "没有选择的文件或目录.<br>"; |
||
384 | } |
||
385 | chmod($file, 0777); |
||
386 | |||
387 | endif; |
||
388 | |||
389 | ?> |
||
390 | </form> |
||
391 | </body> |
||
392 | </html> |
||
393 |
If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration: