修改PHP源代码解决Nginx下WebShell的问题

Nginx / Lighttpd + PHP FastCGI的方式正在被越来越多的网站应用,其中让需要虚拟主机支持的用户最烦心的一件事情莫过于站点权限隔离。 目前无论是spawn-cgi或者是php-fpm的方式,都无法动态转变执行用户。尽管可以通过给不同网站以不同的用户身份执行FastCGI,但这也同样失去了FastCGI统一管理的优势,需要为每个网站保留足够的处理进程而不是整体规划。

Google搜之有两个比较广为流传的方法,其中最完美的莫过于直接修改PHP源代码,对打开目录进行鉴权(搜出来的资料最早是anxsoft.com提供的代码)。 方法是在php源代码目录中执行vi main/fopen_wrappers.c,并找到php_check_open_basedir_ex方法,在char *end;和pathbuf = estrdup(PG(open_basedir));之间插入以下的代码:

2010年8月13日 | 归档于 编程高手
标签: , ,

细说如何在PHP中使用共享内存

PHP有两套使用共享内存的函数,一套是System V IPC函数的封装,另一套是shmop。这两个都无需安装外部库文件。前者只能在linux下使用,而且要使用它的话,在安装php的时候要加上 –enable-sysvshm选项;而后者在linux和windows(win2k之后的系统,win98不支持)都可以使用,但在windows的 时候,只有在php是ISAPI运行模式才能正常工作,在安装php的时候要加上–enable-shmop。 这两套函数的使用相当简单,下面分别给出简单的用法,更详细的信息可以参考php手册。 System V的共享内存使用: 1 <?php 2 $key = 12345; // 共享内存的key 3 $memsize = 100; // 共享内存的大小,单位byte 4 $perm = 0666; // 共享内存访问权限,参考linux的权限 5 $var_key = 345; // 共享内存的某变量的key 6 $shmid = shm_attach( $key, $memsize, $perm ); // 创建一个共享内存 7 shm_put_var( $shmid, $var_key, “abc” ); // 插入一个共享内存变量,key为$var_key,值为”abc” 8 shm_detach( $shmid [...]

2010年8月11日 | 归档于 乱七八糟
标签:

php对象与数组的互相转换

stdClass是PHP的一个基类,所有的类几乎都继承这个类,所以任何时候都可以被new,可以让这个变量成为一个object。同时,这个基类又有一个特殊的地方,就是没有方法。在这里还有一点是对象和数组资源耗费的问题:PHP5的对象的独特性,对象在任何地方被调用,都是引用地址型的,所以相对消耗的资源会少一点。在其它页面为它赋值时是直接修改,而不是引用一个拷贝。数组在程序的使用中应该是最方便的,然而数组的每次被引用($a = $b),其实都是创建了一个副本,而且,数组被unset后,还是占用了内存(没有测试过)。还有一个函数arrayobject,可以直接将数组转化为对象这也是一个好办法哦。

2010年8月11日 | 归档于 编程高手
标签: , ,

ESI 动态缓存技术

在实际环境中,一个动态生成的页面,当中可能只有少量的内容是频繁变化的或是个性化的,对于传统的Cache服务器来说,为了能 够保证页面的时效性,却由于页面中这些少量的动态内容而无法将整个页面进行缓存。ESI(Edge Side Include)通过使用简单的标记语言来对那些可以加速和不能加速的网页中的内容片断进行描述,每个网页都被划分成不同的小部分分别赋予不同的缓存控制 策略,使Cache服务器可以根据这些策略在将完整的网页发送给用户之前将不同的小部分动态地组合在一起。通过这种控制,可以有效地减少从服务器抓取整个 页面的次数,而只用从原服务器中提取少量的不能缓存的片断,因此可以有效降低原服务器的负载,同时提高用户访问的响应时间。

2010年8月10日 | 归档于 操作系统
标签: ,

Session有效时间与回收机制

如果”最后的修改时间”到”现在”超过了gc_maxlifetime(默认是1440)秒,这个session文件就被认为是过期了,在下一次session回收的时候,如果这个文件仍然没有被更改过,这个session文件就会被删除(session就过期了)。
简单的说,如果我登录到某网站,如果在1440秒(默认值)内没有操作过,那么对应的session就认为是过期了。
所以,修改php.ini文件中的gc_maxlifetime变量就可以延长session的过期时间了:(例如,我们把过期时间修改为86400秒)
session.gc_maxlifetime = 86400
然后,重启你的web服务(一般是apache)就可以了。
注意:php5里面session过期使用了回收机制。这里设置时间为86400秒,如果session在86400秒内没有被修改过,那么在下一次“回收”时才真的被删除。

2010年8月10日 | 归档于 编程高手
标签: ,

php转换字符编码的两种方法

1. 发现iconv在转换字符”-”到gb2312时会出错,如果没有ignore参数,所有该字符后面的字符串都无法被保存。不管怎么样,这个”-”都无法转换成功,无法输出。另外mb_convert_encoding没有这个bug.
2. mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;如:$str = mb_convert_encoding($str,”euc-jp”,”ASCII,JIS,EUC-JP,SJIS,UTF- 8″);“ASCII,JIS,EUC-JP,SJIS,UTF-8”的顺序不同效果也有差异
3. 一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数

2010年8月6日 | 归档于 编程高手
标签:

程序员怎么选择发展方向

不管是项目经理还是技术经理与产品经理,都要求要熟悉业务,业务是需求的来源,没有不谈业务的技术,所以不管你从哪个方向发展,都要求对业务熟悉。 产品经理要求对业务最熟悉,项目经理次之,技术经理排最后。对于程序员来说,刚开始工作的前几年可以埋头扎到技术里面,一般这个时间在2-3年的时间,然 后就应该多关注业务了。这个业务不一定是指某个具体的业务,因为具体的业务的范围太少,而且也需要机遇。

我见过许多的程序员,他们是做Web开发的,但对互联网很不熟悉,对于互联网流行的趋势基本上不闻不问。不知道现在大家都在使用微博,也不知道SNS,也 可能从不使用网银。我觉得这样很不好,程序员应该多多去关注互联网的发展,多多去玩一些新的网站。

2010年8月4日 | 归档于 编程高手

中国网站备案与认证计划介绍

国家都在搞备案了,企业也不能闲着,通过制定各种各样的认证标准,增加企业的影响力,搞的好的,甚至可以成为行业标准。

网站备案

这个不用多说了,有网站的人都知道,凡是在国内搭建的网站都要申请备案。

署名-非商业性使用-相同方式共享 2.5 中国大陆

这个东西在国内有名无实。不过还是有很多原创网站、博客注明:本站采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本站内容必须也遵循“署名-非商业用途-保持一致”的创作共用协议。

2010年8月4日 | 归档于 主机评论
标签:

深入理解PHP原理之异常机制

恩, 就和改写ip寄存器一样, 改写下一条要执行的op line的序号, 就改变了程序的流向, 这样, 就会进入到了ZEND_HANDLE_EXCEPTION的处理逻辑中.

而在ZEND_HANDLE_EXCEPTION中, 会判断这个异常是否在try catch中,

如果是 则把下一条要执行的op line, 置为第一个catch的op line, 并继续执行.
如果不是 则销毁一些不需要的变量, 和opline, 然后直接结束执行过程.
有的同学要问了:”那set_exception_handler设置的异常默认处理函数(user_exception_handler)什么时候起作用呢?”

2010年8月4日 | 归档于 编程高手
标签: ,

Linux 汇编器:对比 GAS 和 NASM

在 NASM 中,任何不属于我们的程序但是需要在链接时解析的标签都必须预先定义,这就是 extern 关键字的作用(第 24 行)。GAS 没有这样的要求。在此之后,字符串的地址 usort_str 被压入堆栈(第 30 行)。在 NASM 中,内存变量(比如 usort_str)代表内存位置本身,所以 push usort_str 这样的调用实际上是将地址压入堆栈的顶部。但是在 GAS 中,变量 usort_str 必须加上前缀 $,这样它才会被当作地址。如果不加前缀 $,那么会将内存变量代表的实际字节压入堆栈,而不是地址。

2010年8月3日 | 归档于 编程高手
标签: , , ,