搞了个 5.3.8 Hash冲突漏洞补丁

下载:php-5.3.8-max-input-vars.patch

基于这篇文章来滴:
http://www.heike.cn/php/24511.html

5.2.x 版本的补丁请直接在这里下载:
https://github.com/laruence/laruence.github.com/tree/master/php-5.2-max-input-vars

漏洞原理:
http://www.qycn.com/news/5402.html

通过PHP的hash冲突漏洞进行DDoS攻击
http://blog.csdn.net/linvo/article/details/7169718

— EOF —

无废话 Sphinx Server 2.0.1 及 Sphinx Client PHP 模块编译安装

Sphinx 又发新版本了,当前最新版本为 2.0.1。

Sphinx 安装
wget http://sphinxsearch.com/files/sphinx-2.0.1-beta.tar.gz
tar zxf sphinx-2.0.1-beta.tar.gz
cd sphinx-2.0.1-beta
./configure –prefix=/usr/local/sphinx –with-mysql
make && make install

PHP 的模块好久没有更新,只好先使用官方提供的 PHP 接口类(在源代码包的 api/ 目录下)。
实际使用中发现 PHP 模块有存在一些 BUG,建议大家还是使用官方提供的 PHP 接口类,而且在一些情况下,PHP 接口类性能并不比 PHP 模块的差。

— EOF —

PHP 5.3.0 DateTime 类的 BUG

观察以下代码:

setTimezone(new DateTimeZone($tz));

// 输出时间
echo $dt->getTimestamp();
echo “\n”;
echo $dt->format(“Y-m-d H:i:s”);
echo “\n”;

// 时间减7天
$dt->sub(new DateInterval(‘P7D’));

// 输出时间
echo $dt->getTimestamp();
echo “\n”;
echo $dt->format(“Y-m-d H:i:s”);
echo “\n”;

// 再次输出时间
echo $dt->getTimestamp();
echo “\n”;
echo $dt->format(“Y-m-d H:i:s”);
echo “\n”;

正确的输出结果应该是:

1303974000
2011-04-28 00:00:00
1303369200
2011-04-21 00:00:00
1303369200
2011-04-21 00:00:00

可是在 PHP 5.3.0 下测试,输出结果为:

1303974000
2011-04-28 00:00:00
1302764400
2011-04-14 00:00:00
1302159600
2011-04-07 00:00:00

真是不可思议!进一步测试发现每次调用 $dt->getTimestamp() 都会使 $dt 往前再减7天。
有在用 DateTime 类的同学们,赶紧把 PHP 版本升级下吧。
PHP 5.3.3 版本下测试正常。

Google 了一下关键词“php 5.3.0 datetime sub bug”,发现这个确实是一个 BUG。
http://bugs.php.net/49059

— EOF —

无废话 Sphinx Server 及 Sphinx Client PHP 模块编译安装

Sphinx 安装
wget http://sphinxsearch.com/files/sphinx-1.10-beta.tar.gz
tar zxf sphinx-1.10-beta.tar.gz
cd sphinx-1.10-beta
./configure –prefix=/usr/local/sphinx –with-mysql
make && make install

libsphinxclient 安装(PHP模块需要)
cd api/libsphinxclient
./configure –prefix=/usr/local/sphinx
make 时会出现以下错误:

libsphinxclient # make
make  all-am
make[1]: Entering directory `/work/setup/sphinx-1.10-beta/api/libsphinxclient'
/bin/sh ./libtool --mode=compile --tag=CC gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c -o sphinxclient.lo sphinxclient.c
mkdir .libs
 gcc -DHAVE_CONFIG_H -I. -I. -I. -g -O2 -c sphinxclient.c  -fPIC -DPIC -o .libs/sphinxclient.o
sphinxclient.c: In function 'net_connect_get':
sphinxclient.c:1358: error: 'SO_NOSIGPIPE' undeclared (first use in this function)
sphinxclient.c:1358: error: (Each undeclared identifier is reported only once
sphinxclient.c:1358: error: for each function it appears in.)
make[1]: *** [sphinxclient.lo] Error 1
make[1]: Leaving directory `/work/setup/sphinx-1.10-beta/api/libsphinxclient'
make: *** [all] Error 2

请打开sphinxclient.c,将以下代码:

#ifndef _WIN32
        if ( setsockopt ( sock, SOL_SOCKET, SO_NOSIGPIPE, (void *)&optval, (sock
len_t)sizeof(optval) ) < 0 )
        {
                set_error ( client, "setsockopt() failed: %s", sock_error() );
                return -1;
        }
#endif

修改为:

#ifndef _WIN32
#ifdef SO_NOSIGPIPE
        if ( setsockopt ( sock, SOL_SOCKET, SO_NOSIGPIPE, (void *)&optval, (sock
len_t)sizeof(optval) ) < 0 )
        {
                set_error ( client, "setsockopt() failed: %s", sock_error() );
                return -1;
        }
#endif
#endif

如果出现以下错误:

gcc -g -O2 -o test test.o  .libs/libsphinxclient.a
.libs/libsphinxclient.a(sphinxclient.o): In function `set_error':
/opt/software/sphinx-1.10-beta/api/libsphinxclient/sphinxclient.c:359: undefined reference to `_vsnprintf'
collect2: ld returned 1 exit status
make[1]: *** [test] Error 1
make[1]: Leaving directory `/opt/software/sphinx-1.10-beta/api/libsphinxclient'
make: *** [all] Error 2

则注释掉头部的:

#define vsnprintf _vsnprintf

就可以了。

接着:
make install

Sphinx Client PHP 模块安装
wget http://pecl.php.net/get/sphinx-1.1.0.tgz
tar zxf sphinx-1.1.0.tgz
cd sphinx-1.1.0
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-sphinx=/usr/local/sphinx/
make && make install

更新:
Sphinx 2.0.1 版本的安装请看:
http://hily.me/blog/2011/05/sphinx-server-2-0-1-quick-installation/

-- EOF --

无废话 MongoDB 及 PHP 扩展编译安装

操作系统环境:Gentoo Linux

需要使用 scons 编译安装:

emerge scons

安装 mongodb 依赖库:

emerge boost
emerge libpcre
export CFLAGS=”-DJS_C_STRINGS_ARE_UTF8″ # 编译spidermonkey支持utf8
emerge spidermonkey

安装 mongodb:

# 1.6.5 版本

cd /work/setup
wget http://downloads.mongodb.org/src/mongodb-src-r1.6.5.tar.gz
tar zxf mongodb-src-r1.6.5.tar.gz
cd mongodb-src-r1.6.5
scons all
scons –full install

# 2.0.0 版本(2011-09-13 更新)

cd /work/setup
wget http://downloads.mongodb.org/src/mongodb-src-r2.0.0.tar.gz
tar zxf mongodb-src-r2.0.0.tar.gz
cd mongodb-src-r2.0.0
scons all
scons –full install

启动 mongodb 服务器:
创建默认的数据库目录,创建后启动 mongod:

mkdir -p /data/db
/usr/local/bin/mongod

在系统自动启动队列文件 /etc/conf.d/local.start 中添加:

/usr/local/bin/mongod –fork –logpath /var/log/mongodb.log –logappend

安装 PHP 扩展:

wget http://pecl.php.net/get/mongo-1.1.4.tgz
tar zxf mongo-1.1.4.tgz
cd mongo-1.1.4
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config
make && make install

# 2011-09-13 更新

wget http://pecl.php.net/get/mongo-1.2.4.tgz
tar zxf mongo-1.2.4.tgz
cd mongo-1.2.4
/usr/local/php/bin/phpize
./configure –with-php-config=/usr/local/php/bin/php-config
make && make install

最后在 php.ini 尾部加上:

extension = mongo.so

— EOF —