解决Joomla站点的500错误

维护的某Joomla网站突然不能访问,前后台都报500错误。

网上搜了一下,结合apache日志,初步认为是服务器的配置问题。虽然不明白为什么服务器配置为什么会突然不行(因为应该是没人改过),但因为最近有另外的人也在使用后台,心想也许是他的某个操作触发了隐藏的漏洞或者bug。于是就往服务器配置这条路上走了很远。

网上有说是joomla开通SEF功能后的配置问题的,有要修改.htaccess文件的,等等,都不起作用。怕配置文件改除了隐藏的bug自己没发现,甚至干脆尝试了重装XAMPP,数据库备份后恢复,重新配置apache等。仍然没解决,从中午开始忙到晚上,十分崩溃。

然后看PHP源代码。发现所有的php文件头部都被加入了一段混淆过的php代码,于是看了看规律貌似是这样的:

<?php $rzzeaxkup =  xxxxxxxxxxx此处省去无数混淆过的代码xxxxxxxxxx    $rzzeaxkup=$noamvuns-1; ?>

应该是感染了什么,或者被人利用漏洞入侵了。于是使用正则表达式进行查找替换,全部清除掉了,用到的表达式:

^<\?php \$rzzeaxkup.*\$rzzeaxkup=\$noamvuns-1; \?><\?php

以为问题解决后,结果依然显示500错误。

于是,绕不开的代码啊,干起程序员本行,以行行代码调试。终于发现在/libraries/import.legacy.php中有一行:

require_once JPATH_PLATFORM . ‘/legacy/form/field/form.php’;

程序在这里就跑不下去了。于是打开form.php文件,一看愣了。

满屏的乱码,文件开头是这样的:

<?php echo ‘abc’;/* PHP Encode by  http://Www.PHPJiaMi.Com/ */error_reporting(0);ini_set(“display_errors”, 0)

里面指向的 www.phpjiami.com看起来是一个专门做代码混淆加密的网站。也许本站点感染的病毒/木马/后门程序的开发者用到了这个在线加密??

看了看,感觉这个文件应该没什么大作用,于是果断的将对它 require_once的语句注释掉。

再打开网站,前后台终于恢复。

此时已经是凌晨一点半了,详细原因后续再查找,这个加密文件form.php到底做什么用,也待后续再了解吧。

用PHP开发微信应用遇到的坑

最近因为业务需要,尝试着做了一些基于微信公众平台的开发。考虑到主要是网站应用和轻度电商,业务逻辑不复杂,加上看到开源php的东西比较多,于是决定基于php进行开发。
以前基本没怎么研究过php,因此做了如下工作:
安装试用weiphp
安装试用微擎
学习使用thinkphp

遇到问题及解决如下:

PHP方面的:

empty() 只检测变量,检测任何非变量的东西都将导致解析错误。

Thinkphp框架中Model的save()方法,成功时候的返回值并不是数据对象本身,目测是成功的记录条数。

JSON对象要decode成为数组以后,再放入session,取出来的时候方便使用。php还是跟数组配合更好。

foreach语句中,如果要修改所遍历数组的值,则应该用&符号进行引用。

微信方面的:

网页授权的时机选择,如果是在某业务(某方法)中途进行身份验证再去要求网页授权,由于网页授权是回调的方式,因此每个页面(控制器->方法)的逻辑即可能是通过微信回调后在调用的,也可能是还没有微信授权的时候调用的。这样的界面逻辑会比较复杂,容易混乱。因此最后统一成,除非是不需要身份验证的页面,否则一律先要求网页授权再说。

微信内置浏览器/手机浏览器方面的:

注意javascript与html标签在文档中出现的顺序问题,有时候在脚本中用选择器取不到页面元素的值的时候,可能就是这个问题。

音频在部分手机上死活不能播放,哪怕手动点播放按钮也不成。发现跟比特率有关系,128KHz就遇到这样的问题,转成96KHz就好了。

静态页面缓存的问题。有的页面根据业务逻辑会呈现不同的内容,但微信浏览器的缓存会导致最新的业务状态没法体现,显示的还是上一个状态的页面。解决办法是在Header中加入如下信息:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />

安装weiphp遇到不支持prepared语句的问题

安装weiphp过程中报错,遇到如下问题:

SQLSTATE[HY000]: General error: 2030 This command is not supported in the prepared statement protocol yet
错误位置

FILE: /var/www/weiphp.abc.com/ThinkPHP/Library/Think/Db/Driver.class.php  LINE: 210

TRACE

#0 /var/www/weiphp.abc.com/ThinkPHP/Library/Think/Db/Driver.class.php(210): PDOStatement->execute()
#1 /var/www/weiphp.abc.com/Application/Install/Common/function.php(195): Think\Db\Driver->execute(‘– ————…’)
#2 /var/www/weiphp.abc.com/Application/Install/Controller/InstallController.class.php(117): create_tables(Object(Think\Db\Driver\Mysql), ‘wp_’)
#3 [internal function]: Install\Controller\InstallController->step3()
#4 /var/www/weiphp.abc.com/ThinkPHP/Library/Think/App.class.php(233): ReflectionMethod->invoke(Object(Install\Controller\InstallController))
#5 /var/www/weiphp.abc.com/ThinkPHP/Library/Think/App.class.php(277): Think\App::exec()
#6 /var/www/weiphp.abc.com/ThinkPHP/Library/Think/Think.class.php(120): Think\App::run()
#7 /var/www/weiphp.abc.com/ThinkPHP/ThinkPHP.php(101): Think\Think::start()
#8 /var/www/weiphp.abc.com/install.php(39): require(‘/ var/www/weiphp…’)
#9 {main}

知道笼统来说是数据库环境问题,执行脚本的时候报错,但具体是什么问题,以及怎么修改则不甚了了。

网上搜看有人说要设数据库参数 ATTR_EMULATE_PREPARES 为 true,试过在InstallerController.php中设置此参数没解决问题。在Thinkphp框架里面的 Library/Think/Db/Driver/Driver.class.php设置此参数,也没解决问题。

最后暂时绕开了, 手工执行了install.sql脚本, 注释掉了出错的代码,再运行安装程序,成功。