您的位置:首页 > 其它

UCenter用户头像的存储规则 转

2015-07-07 13:46 309 查看
之所以关注这个问题,是因为某论坛一打开某个页面MSE就报毒,而且每次都是同一个头像文件:xx_avatar_middle.jpg (xx是数字),当时很奇怪,不过一直无解也就没管。几个月后,也就是前几天,才想要弄明白这个问(因为加入了该论坛团队,有兴趣也有条件了)。

啰嗦一下过程(有点离题),由于过了比较长的时间,记不得是哪个会员的头像了,只记得头像文件名,于是去uc的头像目录,执行

find ./ -name "xx_avatar_middle.jpg" >avatar.txt

1

find ./ -name "xx_avatar_middle.jpg" >avatar.txt

得到好多xx_avatar_middle.jpg文件,这下傻眼了,一开始以为头像文件名唯一呢。

还好MSE认得这个文件,于是借助Notepad++,将上面的avatar.txt的
./xx/xx/xx_avatar_middle.jpg替换为 wget -x
urlofavatardir/xx/xx/xx_avatar_middle.jpg,得到一个bash脚本:

#!/bin/bash
wget -x url/xx/xx/xx_avatar_middle.jpg
....

1
2
3

#!/bin/bash
wget -x url/xx/xx/xx_avatar_middle.jpg
....

-x选项是在本地建立和服务器一样的目录,否则下载下来一堆同名文件还是搞不清楚是文件在哪里。

然后执行,果然MSE又报毒了:




MSE图片报毒

具体内容如下:

类别: 特洛伊木马

描述: 这个程序很危险,而且执行来自攻击者的命令。

推荐的操作: 立即删除这个软件。

项目:
file:D:\xx\xx\data\avatar\000\0x\xx\xx_avatar_middle.jpg

1
2
3
4
5
6
7
8

类别: 特洛伊木马

描述: 这个程序很危险,而且执行来自攻击者的命令。

推荐的操作: 立即删除这个软件。

项目:
file:D:\xx\xx\data\avatar\000\0x\xx\xx_avatar_middle.jpg

找到图片位置后,接下来就是分析这张图片了,一开始没想着直接打开,直接在服务器上对图片进行base64的编码与解码,发现图片尾部被插入了一段 代码,可是看过代码之后貌似也没什么,就是普通的网页不过带了一些广告而已。之后用文本编辑器打开图片,确实可以看到文件末尾插入了一段网页代码。

接下来,就是好奇这个用户是谁了,他为什么要往头像离插代码,可是,面对UC头像的存储,毫无头绪,只得求助度娘,很快找到了,在Discuz官网有人分享了ucenter头像的存储规则:

function get_avatar($uid, $size = 'middle') {
$size = in_array($size, array('big', 'middle', 'small')) ? $size : 'middle';
$uid = abs(intval($uid)); //UID取整数绝对值
$uid = sprintf("%09d", $uid); //前边加0补齐9位,例如UID为31的用户变成 000000031
$dir1 = substr($uid, 0, 3); //取左边3位,即 000
$dir2 = substr($uid, 3, 2); //取4-5位,即00
$dir3 = substr($uid, 5, 2); //取6-7位,即00
// 下面拼成用户头像路径,即000/00/00/31_avatar_middle.jpg
return $dir1.'/'.$dir2.'/'.$dir3.'/'.substr($uid, -2)."_avatar_$size.jpg";
}

1
2
3
4
5
6
7
8
9
10

function get_avatar($uid, $size = 'middle') {
$size = in_array($size, array('big', 'middle', 'small')) ? $size : 'middle';
$uid = abs(intval($uid)); //UID取整数绝对值
$uid = sprintf("%09d", $uid); //前边加0补齐9位,例如UID为31的用户变成 000000031
$dir1 = substr($uid, 0, 3); //取左边3位,即 000
$dir2 = substr($uid, 3, 2); //取4-5位,即00
$dir3 = substr($uid, 5, 2); //取6-7位,即00
// 下面拼成用户头像路径,即000/00/00/31_avatar_middle.jpg
return $dir1.'/'.$dir2.'/'.$dir3.'/'.substr($uid, -2)."_avatar_$size.jpg";
}

这样很快找到了问题头像的主人,不过也没啥收获,就此收手了。

最后贴出这个帖子,代码上面已经贴过就从略了,内容很实用:



自DZ0606版开始,用户头像与UC合并,而且采取了新的存贮规则。

为了彻底了解UC系统头像的存贮方式,对DZ的头像解析程序 avatar.php进行了简单分析。

请看下面(这里是上面)的程序段:

所以,UID为31的用户,其头像文件的正确路径为:

uc/data/avatar/000/00/00/31_avatar_small.jpg

uc/data/avatar/000/00/00/31_avatar_middle.jpg

uc/data/avatar/000/00/00/31_avatar_big.jpg

如果在以上位置找不到相应的文件,则自动重定向到:

Location: images/noavatar_$size.gif

也就是:

uc/images/noavatar_small.gif

uc/images/noavatar_middle.gif

uc/images/noavatar_big.gif

根据提交的参数调用其中的一个显示。

============================

明白了以上道理,实际应用中如果出现用户头像显示问题,就可以采取以下变通处理:

1. 模板中直接调用头像:

<img src=http://你的域名/UC目录名/avatar.php?uid=$post[authorid]&size="small" border=0/>

1

<img src=http://你的域名/UC目录名/avatar.php?uid=$post[authorid]&size="small" border=0/>

2. 升级后自行整理上传用户头像:

如果升级后有些用户头像显示不出来,你可以直接按照以上规则创建目录,将customavatars/下的用户自定义头像上传到相应目录并重新命名。

例:某用户UID为12345,原头像保存在customavatars/12345.jpg,根据以上算法,升级后的头像目录即为:

uc/data/avatar/000/01/23/

那么你就可以将用户原头像文件复制-改名为:45_avatar_middle.jpg,45_avatar_small.jpg,45_avatar_big.jpg

上传到该目录下就可以了。

当然,你也可以写一个程序自行完成以上过程。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: