All posts by admin

phpddos应对 最近新起一种udp flood的攻击形式,是利用php中的fsockopen函数往特定机器发送大量UDP包,耗费大量流量,直到网络瘫痪。 php当前只支持用allow url fopen整个禁用 启用网络文件访问,而不支持更细粒度的控制。这里介绍一种源码patch的方式,对该类型的攻击做一些防范。 1…

phpddos应对
最近新起一种udp flood的攻击形式,是利用php中的fsockopen函数往特定机器发送大量UDP包,耗费大量流量,直到网络瘫痪。
php当前只支持用allow_url_fopen整个禁用/启用网络文件访问,而不支持更细粒度的控制。这里介绍一种源码patch的方式,对该类型的攻击做一些防范。

1. 捕蛇打三、七寸
在ext/standard/fsock.c中的php_fsockopen_stream函数中,加入如下代码:
if (!strncasecmp(“udp://”, host, 6)) {
php_error_docref(NULL TSRMLS_CC, E_ERROR, “Unsupported wrapper UDP”);
RETURN_FALSE;
}

if (!strncasecmp(“tcp://”, host, 6)) {
php_error_docref(NULL TSRMLS_CC, E_ERROR, “Unsupported wrapper TCP”);
RETURN_FALSE;
}

2. 频率限制
创建一个全局变量数组,给每个用户维护一个计数器,执行一次函数加一。
fsock_counter[uid] ++;
if (fsock_counter[uid] > 10) {
php_error_docref(NULL TSRMLS_CC, E_ERROR, “Too many calls.”);
RETURN_FALSE;
}
一个请求,禁止发送超过10次的网络请求!

AutoHotKey Windows下的自动化脚本,有点像linux下的expect,呵呵。 几招基本功: 1 msgbox Hello World `nNewline…

AutoHotKey: Windows下的自动化脚本,有点像linux下的expect,呵呵。
几招基本功:
1. msgbox, Hello World! `nNewline starts here
2. run http://blog.eaxi.com/
3. #x:: 绑定 win+x 快捷键
4. #b:: msgbox, win+b
!b:: msgbox, alt+b
^b:: msgbox, ctrl+b
^!b:: msgbox, alt+ctrl+b
!#b:: msgbox, alt+win+b

调试vim慢的原因方法: vim startuptime message txt 启动后,查看message txt中,哪个脚本最慢,再考虑能否禁用加载。在我这里,c vim禁用后,快了非常多。…

调试vim慢的原因方法:
vim –startuptime message.txt
启动后,查看message.txt中,哪个脚本最慢,再考虑能否禁用加载。在我这里,c.vim禁用后,快了非常多。

接下来,可以正常使用vim,然后输入命令
:scriptnames
看到列表后,也能发现耗时脚本。这一步,发现可以禁用菜单、禁用翻译(vim需要这些东西么!),又提速不少!

温州动车追尾事故

23号,造成两百多人死伤的〝温州动车追尾事故〞过去还不到38小时,在原因还没有查清的情况下,铁道部将破损车体碾碎,掩埋,引发民众和媒体的质疑。同时,出事路段已经恢复通车。

7月24日 23:15,铁道部发言人王勇平在温州水心饭店为“7?23”甬温线特别重大铁路交通事故举行新闻发布会。有记者问:“在你们宣布没生命体征、开始拆解车厢时,为什么又发现一个活着的女孩?”铁道部发言人称:“这只是一个奇迹。”记者:“那你们做的决策是不是错了?为什么说没人活着又发现呢?”发言人:“我只能说,它就是发生了。”

7月25日 8:30,《东方卫视》24日7点11分的新闻连线,据现场记者丁桃介绍:“截至当时伤亡人数203人,死亡人数63人…”字幕却显示32人死亡。直到24日晚22点,铁道部发言人王勇平通报7?23事故死亡人数为35人

7月25日 9:30,“35”一个神奇的数字。动车相撞35人死亡,河南平顶山矿难35人死亡;重庆暴雨造成35人死亡;云南遭大雨袭击全省35人死亡。知道为什么死亡人数控制在36人以内吗?超过36人,市委书记这个级别的要撤职,所以一开始发生,就注定了死亡人数不会超过36

7月25日 9:50,一个在医院上班的哥说,其实到今天早上凌晨就已经死了100多了,抬出来的都是死人。只不过到医院走了一遭,算抢救无效,不算立即死亡。媒体被要求隐瞒了数据只说30多。。。。。。。。真是用心良苦。。。

7月25日 15:45,凌晨4点宣布已无生命迹象,14个小时后又救出小孩儿,其间发生的事情有:碾碎掉落的车厢,内部协调,拟于 下午6点通车……我相信了:他们根本就没有尽力救人。

7月25日 17:40,到底伤亡多少人:看下香港党报报导吧! 共6节车厢满员600人掉到30米高桥底下。桥上车厢里有多少人伤亡先不算,桥下已知活着的为210多人,而新华社报的 亡者 为35人。照新华社数据,那么,600(总)-210(伤)-35(亡)=355人,这355人 去 哪了?

7月25日 21:27,@编剧周力军新浪认证:请大家记住这些图,记住这张脸。先是铁三局说没有掩埋列车,挖坑是为了方便作业。后来这位发言人笑嘻嘻地说,确实掩埋了机车,但那是为了垫脚!MD!你家这是盖房子挖地基呀!把车体、尸体、个人物品、证件、钱财,还有血都当基桩打下去呀!以为这样你们就稳当了吗?!我本不善粗口,但真是忍不住!MMD!

7月25日 21:39,杨峰在现场透露了多个细节:24号凌晨他一点就到达了温州南站,但由于种种阻饶,2点半才到达出事车厢,当时现场已经停止救援,工作人员表示没有生命迹象。他的妻子和母亲是24号下午才被挖土机挖出来的,妻子已经没有了脸部,他流着泪问:这是动车撞的还是被挖的?

7月25日 22:18,温州微新闻:#默哀现场直播#动车事故最新爆料!!当晚政府去营救的都是D301的。D3115的16节车厢近百人几乎全都死光!!!没有人去救他们!!!直到第二天下午用铲车车直接去铲的!!!这就是我们国家对待生命的方式吗?政府人员到现在都不露面!现场人越聚越多了!

7月25日 22:50,@新民周刊杨江:杨先生此次事故失去四名亲人:妻子,岳母,大姨子及三岁外甥女,其妻怀孕七个月,所以也可以说失去了五个亲人!他身穿孝衣邀铁道部官员一起参观他因野蛮铲车导致尸体残缺,头部不齐的亲人遗体,该官员连连后退:我给你鞠躬,对不起!

7月25日 22:53,@公民微报:求真相再次发!据报:保险公司收到医院的死亡人数是179个,新闻报道死亡人数不到40人。

7月25日 22:55,网易微博@龚伟杰:保险公司朋友告诉我,现在核实死亡216人 还没有核实的。

7月26日 8:30, @truth_cn这样都被兲朝狗官想得出: 中新浙江网7月25日电(记者 赵晔娇)有消息称,“温州事故原因有新进展:铁路调度程序员出现BUG(故障)是本次事故的根本原因,警方已经拘留了两名无证程序员。上海大火是无证电焊工,这次是无证程序员。

7月26日 8:37,中央人民广播电台翔宇:铁道部发言人王勇平说:“雷击造成设备故障。”而全国雷电防护标准化技术委员会委员关像石却说:“我只有两句话好说!第一句,此次事故绝对是人祸!第二句,我对政府的善后工作很失望!”

7月26日 14:04,家属看到领导来了,非常气愤,起冲突了,砸了水瓶。

7月26日 14:21,记者不让他们走,家属在质问,家属和领导发生激烈冲突。“我妹妹还有半个头在里面!!!!”汤先生声斯力捷的喊!!!!!

7月26日14:36,汤先生给专家跪下了,但是他们动用警力把记者强行拉住。汤先生已经哭的不行了,央视的记者大骂铁道部的人是狗!!!

7月26日 14:44,这就是所谓的专家,坐在那里一言不发,我与他们一同身为人类感到可耻。

7月26日 15:10,一听到是省内某城市的记者来采访,家属直接拒绝回答,“跟你们说他妈屁用,又不能播”。

7月26日 15:37,家属不知又被带往何处,刚才有人向他们保证切割前会通知他们,你们信吗?

7月26日 16:02,遇难者家属陈峰在事故中失去了五位亲人,其中包括他怀孕7个月的妻子。面对镜头,他对救援工作提出质疑

7月26日 15:01,浙江省委书记大人实在很忙!!当年杭州地铁塌陷,他在海外访问;前两天三桥垮塌,他在海外访问;温州动车追尾,他也在海外访问。

7月26日 15:30,一个强盛的国家,开放枪支都不会被颠覆;一个虚弱的政体,买菜刀都需要实名;一个人性的国家,总统会逐一念出遇难者的名字致以哀悼,一个冰冷的政府,遇难人数从来都是高度机密要被隐瞒;一个自由的国家,记者可以将内阁大臣追问到满头大汗,一个禁锢的体制,官员则告诉记者,你爱信不信,反正我信。

7月26日 15:30,上海铁路局局长、党委书记、副局长三人就地免职之后,铁道部总调度长安路生调任上海铁路局局长。安路生,2006年任总调度长,2008年因胶济铁路4.28重大事故免职,之后出任成都铁路局局长,2009年调任上海铁路局局长,2010年重新出任铁道部总调度长。这算什么???

7月26日 12:25,今天《人民日报》头版:“党的恩情比天高”。
不知道哪里有痰盂,我想。

铁道部发言人王勇平先生你好,您的大女儿王晓英是铁道部财务局主任,大女婿李阁奎是北京市交通局副局长,二女儿王晓霞是北京市计生局处长,二女婿郭亮是北京市中心医院副院长,小儿子王晓飞是铁道部质检科科长,儿媳张宁是市妇联主任,孙子北京市实验小学副班长王小帅,我所了解的这些情况都没错吧?

用C++来编写PHP扩展

前面有文章介绍过如何编写一个简单的PHP扩展。简单说,也就下面几步:

  1. 去ext目录用ext_skel生成扩展框架
  2. 去php源文件目录./buildconf –force
  3. 编辑config.m4
  4. 修改extname.c
  5. ./configure && make && make install

本文介绍下如何在扩展编写过程中,使用C++。

读到这里,如果你还不知道GNU m4或phpize,建议参阅下相关资料。简而言之,GNU m4是一个用于生成文件的宏处理器。这里的phpize是调用了GNU m4来生成configure文件以及其他相关文件。Configure则是生成Makefile的一个bash脚本。

PHP扩展默认使用C语言来完成编码。若想使用C++,需要对config.m4文件做出相应修改。

 


PHP_REQUIRE_CXX()

 

PHP_ADD_LIBRARY_WITH_PATH(tlib, $LIB_EXPORT_PATH, WANGGOU_SHARED_LIBADD)

PHP_ADD_LIBRARY_WITH_PATH(library_sys, $LIB_EXPORT_PATH, WANGGOU_SHARED_LIBADD)

PHP_ADD_LIBRARY_WITH_PATH(library_util, $LIB_EXPORT_PATH, WANGGOU_SHARED_LIBADD)

PHP_ADD_LIBRARY_WITH_PATH(ip_pool, $LIB_EXPORT_PATH, WANGGOU_SHARED_LIBADD)

 

PHP_SUBST(WANGGOU_SHARED_LIBADD)

PHP_ADD_LIBRARY(stdc++, 1, WANGGOU_SHARED_LIBADD)

 

PHP_ADD_INCLUDE($INC_EXPORT_PATH)

PHP_ADD_INCLUDE($EXT_PROTOCOL_PATH)

PHP_NEW_EXTENSION(wanggou, wanggou.cpp, $ext_shared)

 

说明:

上述宏的第一句,表明了该扩展需要使用CXX编译器。

接下来四行,添加扩展中依赖的库,也就是 –Lpath/to/lib –lsomelib 段的内容。

接下来添加C++标准库。

下来两行是头文件包含的目录配置。

最后一行表明源代码文件的名字是以.cpp结尾。需要自己重命名自动生成的wanggou.c

 

接下来就是编码了,像平常一样include头文件,修改完文件,直接make来测试。

祝你成功!

–EOF—

PHP SSH2

function exec($cfg)
{
$conn = ssh2_connect($cfg[‘fip’], C(‘SSH_PORT’));
if (!$conn) return “cannot connect to server {$cfg}:”.C(‘SSH_PORT’);

$auth = ssh2_auth_password($conn, $cfg[‘flogin’], $cfg[‘floginpwd’]);
if (!$auth) return “auth failed”;

$stdout_stream = ssh2_exec($conn, C(‘REALTIME_CMD’));
//$stdio_stream = ssh2_shell($conn);

$stderr_stream = ssh2_fetch_stream($stdout_stream, SSH2_STREAM_STDERR);

stream_set_blocking($stderr_stream, true);
stream_set_blocking($stdout_stream, true);

$out = “”;
while($line = fgets($stdout_stream)) { flush(); $out .= $line;}

$err = “”;
while($line = fgets($err_stream)) { flush(); $err .= $line; }

fclose($stdout_stream);
fclose($stderr_stream);

return array($out, $err);
}
php_ssh2.dll

编写PHP扩展实践

之前写过一篇关于在Windows下搭建PHP编译环境的文章http://blog.eaxi.com/compiling-php-on-windows/,现在接着介绍下如何编写一个属于自己的PHP扩展。
从PHP5开始,PHP自带了一个ext_skel的脚本,帮助开发者快速的创建一个扩展,现在我们就从这里开始。
首先我们切换到源码目录。

cd ext/
./ext_skel –extname=new_ext

值得注意的是,需要先切换到ext/目录再执行./ext_skel,否则会有些资源文件找不到。
现在脚本就已经帮我们创建好了扩展目录,可以开始编写程序了。

vi new_ext/config.m4

编辑如下几行,以启用这个扩展:

cd ..
./buildconf –force

./buildconf的命令我们加了–force,是因为我们选择基于正式版来编写扩展。从svn或者snaps.php.net下载的开发版则无需加此参数。

./configure –help | grep new_ext

现在,我们就已经可以在编译时使用上新的参数了,在帮助输出中已经有所体现。加上 –enable-new_ext 就可以启用我们的新扩展!

./configure –disable-all –enable-cli –enable-new_ext
make
./sapi/cli/php ext/new_ext/new_ext.php

为了加快编译,我们先用–disable-all禁用默认的扩展,只启用cli,和我们的新扩展。
最后一句是执行默认的测试程序,确认扩展已经成功编译进到PHP。
如果编译无错,就可以继续往下了。接下来我们修改下源文件,实现一个自己的小功能:实现一个函数,它接受一个用户名参数,返回这个用户在系统中的信息,用户不存在则返回NULL。

PHP_FUNCTION(getpwnam);

在php_new_ext.h中,加上这一句,声明我们的新函数名。加入的位置参考例子程序。

zend_function_entry new_ext_functions[] = {
PHP_FE(getpwnam, NULL) /* */
{NULL, NULL, NULL} /* Must be the last line in new_ext_functions[] */
};

在new_ext.c中,先在这个数组中加上函数名,以便系统知道我们的新函数。

PHP_FUNCTION(getpwnam)
{
char *arg = NULL;
int arg_len, len;
struct passwd *pw;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, “s”, &arg, &arg_len) == FAILURE) {
RETURN_NULL();
}

if (NULL == arg || arg_len == 0) RETURN_NULL();

pw = getpwnam(arg);
if (NULL == pw) RETURN_NULL();

array_init(return_value);
add_assoc_stringl(return_value, “name”, arg, arg_len, 1);
add_assoc_string(return_value, “gecos”, pw->pw_gecos, 1);
add_assoc_string(return_value, “home”, pw->pw_dir, 1);
add_assoc_string(return_value, “shell”, pw->pw_shell, 1);
add_assoc_long(return_value, “uid”, pw->pw_uid);
add_assoc_long(return_value, “gid”, pw->pw_gid);
}

加上这段实现的代码,其他的代码保留原样。其中,return_value是PHP_FUNCTION()宏给每个PHP函数预先定义好的,类型为zval*,表示返回值。初始化为NULL,要返回变量时,修改它就可以了。

make

修改代码后,返回源码根目录直接make就可以了。