几何尺寸与公差论坛

 找回密码
 注册
查看: 2004|回复: 1

30分钟+2个字符,修改了vbulletin的源代码,国内第1次圆满解决php安全模式下的附件

[复制链接]
发表于 2009-12-24 10:59:42 | 显示全部楼层 |阅读模式
说明:此篇文章适合所有虚拟主机php安全模式下,把vbulletin的附件从数据库转换到文件系统的要求。

第一次使用vbulletin,想投机取巧,把论坛空间通过http传入的附件,通过ftp模式传入来替换。找了半天没找到我传入的文件。一查才知道,vbb的附件默认是导入到数据库的。妈呀!多费数据库空间啊。还有别人购买的3G论坛空间银子不是白花了吗。又一查,原来可以在附件设置里把附件从数据库导入到空间的文件系统。

试了下才知道,又弹出来个php在安全模式下的窗口,然后就程序就中断了。

什么php安全模式?虽然也是计算级专业毕业,但毕业后到现在4年都没摸过技术了,哪知道什么php安全模式,也是刚刚赶鸭子上架会架设php环境的。

又查php安全模式,才明白,这下难办了,我用的是虚拟主机,php安全模式修改的权限在虚拟主机商。他们开不开很难说。

因为虚拟主机大多数都是php安全模式,所以我查了下很多人都遇到这样的问题,查官方也没人解决,至今网络上包括vbulletin官方成员支持都还没有解决这个问题。寻求前人的经验被堵死了。无奈只好自己想办法。

因曾看到一个介绍说因为,附件导入到文件系统时,php要调用函数来创建存放的目录,而php安全模式下这些函数被禁用,所以就会出现这样的情况。

而且检测php安全模式有2种情况,如果只是刚设置时检测一下,那暂时关掉php安全模式以后就可以了。如果一直需要php安全模式关闭的支持附件才可以放到空间文件系统上,这是虚拟主机商绝对不可能做到的

于是在本地测试。原来安全模式检测只是,开始需要检查下。以后附件转换时就根本不用检查了。同时设定穆勒的深度为3层的目录,程序都可以自己创建, 同时我跟虚拟主机客服要求禁用php安全模式的话一直没回复,看来没戏了。

突然产生了“妄想”修改一下vbb源程序的想法,结果30分钟内就找到代码段并修改好,非常简单,简单到难以置信的程度。而且在网络上测试圆满成功。毕业后4年都没有摸过技术了,好多东西都忘了,也没想到自己还是那么“厉害”。
具体操作过程,今天搞定后太累了,我会明后天写出来和大家分享。
未完待续...

原来php调用md_dir函数时创建用来存放附件的文件时,因为php安全模式md_dir函数被禁用,就中途退出了。那把这段代码屏蔽,并用FTP创建目录,不久可以解决这个问题吗。

基于这样的认识,于是确信可以通过手工修改源代码来实现,附件到文件系统的功能。

难处就在定位出错代码段。就是先要寻找到目标。
  因为提醒php安全模式,可能程序中用的变量可能是"safe_mode",这个也要利用变量在论坛源程序中搜索出代码段。但搜索文本"safe_mode",没找到。最后看了下整个vbb的目录和文件,应该就是根目录中的attachment.php实现的。可是打开后没有看到实现附件存放位置转换的程序段。

那就这样吧,搜索下关键字"attachment",结果出来差不多14个文件,其中文件名含attachment的有9个,文件中源程序含attachment的有5个。妈呀要从14个文件中找,要累死我呀。

看了分别所属的目录,把目标缩小到5个(根目录下2个,/admincp目录下3个)
只有一个一个打开源代吗从中寻找了。

用ultraedit打开php文件,终于从/admincp目录下的attachment.php发现了那个从数据库到文件系统的模块,如下:

// ###################### Swap from database to file system and vice versa ##########
if ($_REQUEST['do'] == 'switchtype')
{
$vbulletin->input->clean_array_gpc('r', array('dowhat' => TYPE_STR));
...
...
else
{
if (SAFEMODE)
{
// Attachments as files is not compatible with safe_mode since it creates

directories
// Safe_mode does not allow you to write to directories created by PHP
print_stop_message('your_server_has_safe_mode_enabled');

}
...
...
发现了全局变量php安全模式的全局变量SAFEMODE。

到这里才发现,哎呀,原来VBB客户支持都不能解决的问题,就这么简答啊。

于是
第1步在我在函数print_stop_message前敲了2个字符"//",把那条代码变成注释就搞定了至今网络上包括官方都不能解决的难题。

然后就是本地测试成功。
第2步FTP把修改过的php文件传到论坛空间/admincp目录覆盖掉原文件attachment.php。
第3步在空间根目录中创建比如attachment目录,仍何你想命名的目录都可以。

第4步需要注意的是,点击附件存储类型变换存储类型时,这时就不会提示php安全模式而终止的窗口,但注意目录你要修改成类似"./attachment"之类,斜杠前的小数点不要忘了。然后继续,即使出现附件从数据库转换到文件系统的提示,也必须检查空间也是不是导入了附件文件。附件文件在设定目录的深层目录中以"数字.attach"命名。
   同时我当时在本地测试时,到这一步时,发现其实这时附件并没有导入到空间系统。但系统已提示了导入。可能又是需要创建目录的问题。由于我已把存储类型更改成了文件系统,于是我从论坛上发一个附件的测试帖子,然后再观察附件目录文件的变化,这时发现了一个最关键的现象:VBB附件在转入到文件系统中还需要在设定目录下再创建下3层的目录,虽然是php安全模式,但也是程序自己创建的。具体机制,还没来的及分析。

第5步这一步提示大家,请你在论坛有附件的板块都发一个有附件的帖子,以便创建好装从数据库导过来附件的目录,然后重复数据库到文件系统的工作。(需要先文件系统到数据库,再数据库到文件系统,因为你还没有点已确定到文件系统的确定选项,所以附件还保留在数据库系统中)

第6步空间中看到附件文件后,
最后才能选择点选确定数据库的附件已导入到文件系统的选项。因为你选择确定,数据库就会把附件从数据库中删除。而空间又没有,倒霉的就只有你了。除非附件不多而你又一个一个下载备份了,可以一个一个上传恢复。


就这样增加了2个'/'的字符,屏蔽了一条源代码,实现了目前vbb官方客户支持都还没解决的问题。
神奇的就像,下一个棋子很容易,但棋盘这么大,限定时间内往哪里下就是决定胜负的分界.
就像,你随意的一个动作,别人因此爱上你一样。
也就像,生命中,刹那的一个因缘,而决定了一生乃至生生世世一样..、
 楼主| 发表于 2009-12-24 11:00:28 | 显示全部楼层

回复: 30分钟+2个字符,修改了vbulletin的源代码,国内第1次圆满解决php安全模式下

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-4-27 17:53 , Processed in 0.038030 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表