|
kuing
发表于 2024-2-17 01:26
本帖最后由 kuing 于 2024-2-17 02:00 编辑 3# 丢了,我补充一下:
现在本论坛服务器目录下有一个 attachment.php 内容如下:
- <?php
- require './source/class/class_core.php';
- header("Content-Type: text/plain");
- $discuz = C::app();
- $discuz->init();
- foreach(range(0,9) as $i)
- foreach(DB::fetch_all('SELECT `attachment` FROM '.DB::table('forum_attachment_'.$i)) as $j)
- foreach($j as $k)
- print($k."\n");
复制代码
看起来是生成附件列表用的。
然后在 kuing.epizy.com/backup/ 下有一个 index.php 内容如下:
- <?php
- error_reporting(E_ALL);
- ini_set('display_errors', '1');
- function grab_image($url,$path){
- $ch = curl_init($url);
- $fp = fopen($path,'w');
- if (!$fp) return -1;
- curl_setopt($ch, CURLOPT_FILE, $fp);
- curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
- curl_exec($ch);
- if (curl_errno($ch)) echo 'Error:' . curl_error($ch);
- curl_close($ch);
- fclose($fp);
- if(filesize($path)<10)return -1;
- foreach(array('302','403','429') as $err)if(filesize($path) == filesize("$err.htm") && md5_file($path) == md5_file("$err.htm"))return $err;
- return 0;
- }
- function download_attachment($url,$path){
- if(!is_dir($dir=dirname($path))) mkdir($dir, 0777, true);
- $status = grab_image($url,$path);
- if($status)unlink($path);
- return $status;
- }
- $rdi = new RecursiveDirectoryIterator('.', FilesystemIterator::SKIP_DOTS);
- $rii = new RecursiveIteratorIterator($rdi);
- $files = array();
- if (!function_exists('str_starts_with')) {
- function str_starts_with($haystack, $needle) {
- return (string)$needle !== '' && strncmp($haystack, $needle, strlen($needle)) === 0;
- }
- }
- foreach ($rii as $di) {
- $di->getPath() == '.' || str_starts_with($di->getPath(),'./deleted') || $files[] = substr($di, 2);
- }
- if (!file_exists('attachment.txt')) {
- file_put_contents('attachment.txt', file_get_contents('https://kuing.cjhb.site/attachment.php'));
- echo ('<h1>拉取<a href="attachment.txt">附件列表</a>完毕</h1>');
- }
- $attachlist = explode("\n", file_get_contents('attachment.txt'));
- $deleted = array_diff($files, $attachlist);
- if ($count = count($deleted)) {
- echo '<h1>开始删除', $count, '个附件</h1>';
- foreach ($deleted as $attach) {
- if(!is_dir($deldir = 'deleted/'.dirname($attach))) mkdir($deldir, 0777, true);
- echo "<p>$attach</p>";
- rename($attach,'deleted/'.$attach);
- }
- echo '<h1>删除完毕</h1>';
- } else
- echo '<h1>没有需要删除的附件</h1>';
- $added = array_values(array_diff($attachlist, $files));
- $oldcount = count($added) - 1;
- if (!$oldcount) {
- unlink('attachment.txt');
- exit('<h1>没有需要下载的附件</h1>');
- }
- foreach ($added as $i => $attach) {
- if (!$attach || $i == 1000)
- break;
- $url = "https://kuing.cjhb.site/data/attachment/forum/$attach";
- $status = download_attachment($url, $attach);
- if ($status) {
- echo "<p style='color:red'><a href='$url'>第".($i+1)."个附件</a>下载失败:$status</p>";
- } else {
- echo "<p style='color:green'><a href='$url'>第".($i+1)."个附件</a>下载成功:<a href='$attach'>打开</a></p>";
- unset($added[$i]);
- }
- }
- $newcount = count($added) - 1;
- echo "<h1>下载了", $oldcount - $newcount, "个附件,还剩", $newcount, "个</h1>";
- if (!$newcount) {
- unlink('attachment.txt');
- echo '<h1>下载完毕</h1>';
- }
- ?>
复制代码
这个的代码太复杂,我基本看不懂,反正就是下载本论坛附件的。
另外在这个文件旁边还有一个 attachment.txt ,估计是存放附件列表的。
以前用过几次感觉挺好的。
然鹅,有一次却出现了错误,导致所有备份的附件都移到了 /deleted/ 文件夹内。
(也幸亏当时我提出需要删除的不要直接删除,而改为移走)
进入 kuing.epizy.com 的 filemanager,发现除了附件移了外,还多出了几个名字奇怪的文件夹:
再打开 attachment.txt ,发现里面并不是附件列表,而是以下文本:
- <!doctype html>
- <html data-adblockkey="MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANDrp2lz7AOmADaN8tA50LsWcjLFyQFcb/P2Txc58oYOeILb3vBw7J6f4pamkAQVSQuqYsKx3YzdUHCvbVZvFUsCAwEAAQ==_NtvjDYCJoJ2iuutEE0ZcNJi1jkjX9WbYcS/Sg7GUEMJ6fcXLshfoPbtP/ydaqZsGsoirqZDWh5sS74mkMFySNQ==" lang="en">
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVQI12P4//8/AAX+Av7czFnnAAAAAElFTkSuQmCC">
- <link rel="preconnect" href="https://www.google.com" crossorigin>
- </head>
- <body>
- <div id="target" style="opacity: 0"></div>
- <script>window.park = "eyJ1dWlkIjoiYjc4YWYxNzUtODdkYS00Y2M2LWE4YjEtMTJmZjZhZDRmNWIyIiwicGFnZV90aW1lIjoxNzAyOTkyNjk5LCJwYWdlX3VybCI6Imh0dHA6Ly9rdWluZy5pbmZpbml0eWZyZWVhcHAuY29tL2F0dGFjaG1lbnQucGhwIiwicGFnZV9tZXRob2QiOiJHRVQiLCJwYWdlX3JlcXVlc3QiOnt9LCJwYWdlX2hlYWRlcnMiOnt9LCJob3N0Ijoia3VpbmcuaW5maW5pdHlmcmVlYXBwLmNvbSIsImlwIjoiMTg1LjI3LjEzNC42NyJ9Cg==";</script>
- <script src="/bhnImZNIF.js"></script>
- </body>
- </html>
复制代码
看来,就是因为这个 attachment.txt 的生成出了错,进而移走了所有附件并生成了乱78zao的文件夹。
自此之后,我就没再用它来备份附件了,还是手动备份吧——用 FileZilla 进入 FTP,把附件下载到本地,麻烦点而已。
但是,我还是想问一下楼主:
为啥会出现这种情况,以及如何改进,以避免这种情况的发生?
比如多加一个确认操作,只有当人点击确定才进行下一步移走或下载?
还有,我是否可以现在进入 https://kuing.cjhb.site/attachment.php 查看当前的所有附件的列表,复制已备份过的那些行(需要手工筛选),粘贴到 attachment.txt 里保存,再进入 kuing.epizy.com/backup/ 就会继续备份之前没备份的那些? |
|